Philippe Bayvejiel
=
=, Edimicro
RS SL a de.
A É S ,
GUIDE DE L'ORIC
Philippe BAY VEJIEL est le pseudonyme des quatre auteurs de l’ouvrage : Michel
BIRADES, Dominique JOLY, Philippe LE BITOUX, Jean-Marie VALLADE.
Cet ouvrage a été réalisé sous la direction de Benoît de MERLY.
© F.D.S./Edimicro 1983
Première édition
Imprimé en France. Droits mondiaux réservés.
« La loi du 11 mars 1957 n'autorisant. aux termes des alinéas 2 et 3 de l'article 41, d'une part, que les
« copies ou reproductions strictement réservées à l'usage privé du copiste et non destinées à une utili-
sation collective » et, d'autre part, que les analyses et les courtes citations dans un but d'exemple et d'il-
lustration. « toute représentation ou reproduction intégrale, ou partielle. faite sans le consentement de
l'auteur ou de ses ayants droit ou ayants cause, est illicite » (alinéa 1°" de l'article 40) ».
« Cette représentation ou reproduction, par quelque procédé que ce soit, constituerait une contrefaçon
sanctionnée par les articles 425 et suivants du Code pénal ».
ISBN : 2-904457-02-X
EDIMICRO
DÉPARTEMENT ÉDITIONS DE F.D.S. SARL
121-127, avenue d'Italie, 75013 Paris. Tél. 585.00.00
GUIDE DE L'ORIC
par
Philippe BAYVEJIEL
= =
= Edimicro
Préface
Vous êtes ou vous serez bientôt, en possession d'un
microordinateur Oric. Votre achat est justifié par des
besoins personnels (curiosité, besoin de développer l'in-
formatique familiale) ou professionnels (problèmes de
paye, de comptabilité, de gestion de stocks).
Vous désirez maintenant apprendre à vous servir de
votre machine, c'est-à-dire découvrir et utiliser au
mieux toutes ses possibilités, et ainsi rentabiliser
votre nouvelle acquisition. C'est 1à le but de ce guide.
A qui s'adresse le GUIDE DE L'ORIC ? Principalement à
ceux qui n'ont que des connaissances très restreintes en
informatique ou en programmation. Il s'agit donc avant
tout d'une initiation, mais d'une initiation suffisamment
poussée, pour vous permettre de programmer correctement.
Toutes les notions dont vous avez besoin sont abor-
dées progressivement. A l'aide de programmes simples et
commentés, vous assimilerez sans peine le maniement de
la machine et vous maîtriserez le vocabulaire de base
pour converser avec votre Oric. Ce vocabulaire sera
ensuite approfondi pour vous permettre de faire des gra-
phiques, de la musique ou des mathématiques.
Nous vous engageons, lors de votre apprentissage, à
faire exécuter par Oric les exemples commentés, puis
les modifier au gré de votre imagination. En effet, la
pratique de l'ordinateur est, avant tout, expérimentale.
Seule une utilisation effective vous permettra de pro-
gresser rapidement et d'acquérir les quelques règles
simples qui feront de vous un bon utilisateur.
A l'issue de la lecture de ce livre, vous aurez
constaté que l'ensemble des possibilités de votre Oric
n'a pas d'autres limites que celles de votre imagina-
tion...
Table des matières
Chapitre 1 : Présentation générale de l'Oric
1.1
1.2
1.3
1.4
1.5
1.6
1.7
Introduction
Le clavier
L'unité centrale
La sortie vidéo
La sortie cassette
Les extensions
Mise en route
Chapitre 2 : Initiation à la programmation
2.1
2.2
Introduction
2.1.1 Stockage de l'information
2.1.2 Notion de langage - Le Basic
Mode direct - Mode différé
2.2.1 Introduction
2.2.2 Fonctionnement en mode direct
- Les opérations élémentaires
* addition
* soustraction
* multiplication
* division
* puissance
- Les ordres de priorité des opérateurs
—- Notion de variable
Les bases de la programmation -
Découverte du langage Basic
2.3.1 Le premier programme
2.3.2 L'instruction GOTO
2.3.3 La commande LIST
— V -
11
11
13
15
16
16
18
26
26
30
2.3.4 CTRL-C, CONT 31
2.3.5 RESET 32
2.3.6 L'instruction INPUT 33
2.3.7 L'instruction PRINT 34
2.4 Commandes fondamentales 36
2.4.1 Connaître le contenu d'un programme -
La commande LIST 36
2.4.2 Effacement d'un programme -
La commande NEW 38
2.4.3 Lancement d'un programme -
La commande RUN 39
2.4.4 Fin d'un programme -
Les instructions STOP/END 40
2.4.5 Corrections et modifications
de programmes 40
- insertion d'une ligne
- suppression d'une ligne
— modification complète d'une ligne
- modification de quelques caractères sur
une ligne
2.5 Créez votre jeu en Basic 42
2.5.1 Présentation du jeu 42
2.5.2 Instruction IF ... THEN ... ELSE 43
2.5.3 Première version du jeu 46
2.5.4 Fonction RND 47
2.5.5 Fonction INT 48
2.5.6 L'instruction REPEAT ... UNTIL 49
2.5.7 Seconde version du jeu 50
2.5.8 L'instruction WAIT 50
2.5.9 L'instruction EXPLODE 50
2.5.10 Notion de boucle - FOR ... NEXT 51
2.6 Conclusion 52
Chapitre 3 : Le langage Basic de l'Oric 53
3.1 Généralités 53
3.2 Constantes - Variables - Indices 54
3.2.1 Les constantes 54
- les constantes numériques
- les constantes alphanumériques
SANT =
3.4
3.5
3.7
3.2.2 Les variables simples
— les chaînes de caractères
- les variables entières
— les variables réelles
3.2.3 Les tableaux
— les tableaux de variables entières
- les tableaux de chaînes de caractères
— les tableaux de variables réelles
Les opérateurs
Les opérateurs arithmétiques
Les opérateurs relationnels
Les opérateurs logiques
— action de AND
— action de OR
- action de NOT
3.3.4 Règles d'évaluation des expressions
3
3%
3
œ ©
S D
Les instructions Basic facultatives
3.4.1 CLEAR
3.4.2 DIM
3.4.3 END
3.4.4 Fonction FRE
3.4.5 Instruction LET
3.4.6 Arrêt STOP
3.4.7 Commentaires REM
Les instructions de transfert
3.5.1 Branchement inconditionnel
— GOTO
— ON ... GOTO
3.5.2 Transferts conditionnels
— IF ... THEN ... ELSE
Les boucles
3.6.1 Boucle FOR ... NEXT
3.6.2 Boucle REPEAT ... UNTIL
Les sous-programmes
3.7.1 Présentation -— GOSUB - RETURN
3.7.2 ON ... GOSUB
— VIT —
58
64
71
71
72
73
74
79
82
83
84
88
89
89
91
3.7.3 Appel de sous-programmes assembleurs -
CALL
3.7.4 Fonctions assembleurs DEF ... USR
3.8 Les fonctions
3.8.1 Fonctions numériques internes
- génération d'un nombre aléatoire
- fonctions mathématiques simples
- fonctions mathématiques complexes
3.8.2 Fonctions de traitement des chaînes de
caractères
- conversion code ASCII/caractère
- conversion chiffre/lettre
- extraction/traitement de chaînes
3.8.3 Création de fonctions utilisateurs
3.9 Les entrées - sorties
3.9.1 Entrées de données -
L'instruction INPUT
3.9.2 Saisie d'un caractère -
L'instruction GET
3.9.3 Saisie au vol d'un caractère -
la fonction KEYS
3.9.4 Lecture des données dans le programme
READ ... DATA
3.9.5 L'instruction RESTORE
3.10 Conclusions
Chapitre 4 : Possibilités graphiques de l'Oric
4.1 Introduction
4.2 Les modes graphiques
4.2.1 Les modes basse-résolution TEXT,
LORES O0, LORES 1
4.2.2 Le mode haute-résolution HIRES
4.3 Les commandes graphiques
4.3.1 Commandes graphiques basse-résolution
- affichage d'un caractère PLOT
- lecture du caractère affiché SCRN
- VIII -
92
92
92
92
93
95
97
97
98
98
99
100
101
101
102
102
106
108
108
4.3.2
Commandes graphiques haute-résolution
— positionnement du curseur CURSET
- déplacement du curseur CURMOV
— tracé d'une droite DRAW
- utilisation de pointillés PATTERN
- affichage d'un caractère CHAR
- tracé d'un cercle CIRCLE
— obtention de la couleur
d'un point POINT
— remplissage de lignes FILL
- effets spéciaux
4.4 Graphiques avancés
Chapitre 5
: Les sons et l'Oric
5.1 Introduction
5.2 Les sons prédéfinis
5.3 Les commandes de sons
5.3.1
5.3.3
SOUND (canal, période, volume)
— le canal
- la période
— le volume
MUSIC (canal, octave, note, volume)
— le canal
— l'octave
- la note
- le volume
PLAY (combinaison des canaux,
du bruit, mode de sortie, période)
— combinaison des canaux de sons purs
— combinaison de bruits
- mode de sortie
- la durée du son
= TX —
114
127
135
135
136
136
137
138
141
ANNEXES
A) Récapitulation des fonctions et
commandes du basic
B) Les messages d'erreur
C) Utilisation d'un magnétophone à cassettes
D) Utilisation d'une imprimante
E) Numérotation hexadécimale -
représentation des nombres
F) Tableau des codes ASCII
G) Carte mémoire de l'Oric
H) Rôle des attributs graphiques
144
145
178
181
183
187
188
189
CHAPITRE 1
Présentation
générale
de l'oric
1.1 INTRODUCTION
L'Oric est un microordinateur : il est extrêmement
petit par rapport aux premiers ordinateurs et son “coeur”
est un microprocesseur. Ainsi que vous pouvez le voir sur
la photo A, l'Oric a un clavier utilisé pour “entrer” des
données et de nombreuses prises pour relier la télévision
et les extensions. À l'intérieur sont placés les circuits
intégrés parmi lesquels figurent le microprocesseur, les
mémoires... (voir paragraphe 1.3). Au début, vous n'avez
besoin d'aucune connaissance en électronique pour utili-
ser votre Oric.
La sortie vidéo est présente à l'arrière de l'appa-
reil et délivre des signaux RVB que l'on transmet à la
télévision par l'intermédiaire de la prise Péritel, four-
nie avec l'Oric (voir paragraphe 1.4) et qui est instal-
lée obligatoirement sur tous les téléviseurs en couleurs
produits depuis 1980, en France.
La photo A montre un Oric 1 avec un gros plan sur le
clavier.
ASSSSSSSSSssn
Lo Lo rar Lord
x EU
PHOTO À : LE SYSTEME ORIC
Votre microordinateur Oric offre de nombreuses pos-
sibilités graphiques et sonores. Avec un affichage gra-
phique haute-résolution de 200 x 240 points sur l'écran,
plusieurs couleurs, vous pourrez utiliser des jeux
graphiques, tracer des courbes sur l'écran.... Avec la
sortie sonore en connexion avec une chaîne hi-fi, vous
pourrez composer de la musique...
Avec l'Oric, vous pouvez vous contenter de programmes
tout faits (jeux, gestion familiale...), mais vous pouvez
aussi composer vos programmes, utiliser des cassettes,
communiquer avec d'autres Oric.... Votre microordinateur
s'avérera bientôt indispensable.
1.2 LE CLAVIER DE L'ORIC
Le clavier incorporé sur la face avant du boîtier
comporte cinquante-sept touches. Il permettra de générer
les lettres majuscules et minuscules, les touches fonc-
tions utilitaires (ESC, RETURN, DEL...), les caractères
spéciaux (ponctuation, opérations...). Il comporte en
outre une barre centrale permettant de générer des
blancs, quatre touches situées de part et d'autre de la
barre centrale et permettant de se déplacer sur l'écran
(gauche/droite/bas/haut). Toutes les touches sont à répé-
tition automatique, c'est-à-dire qu'il suffit de laisser
le doigt appuyé sur la touche pour répéter le caractère
plusieurs fois.
Les touches du clavier de l'Oric sont tactiles. Vous
sentirez avec votre doigt qu'une touche sera enfoncée, et
vous entendrez de plus un léger bruit caractéristique.
Cela permet par exemple de compter à l'oreille le nombre
de caractères, sans regarder le clavier.
L'Oric ayant été créé en Angleterre, la disposition
des touches sur le clavier est identique à celle des
machines à écrire anglaises (QWERTY). Toutefois, ceci ne
doit pas vous gêner si vous connaissez les machines à
écrire françaises, la différence étant limitée aux let-
tres À, Z, Q, W, et M.
Le clavier de l'Oric est simple d'emploi et vous se-
rez vite familiarisé avec lui.
PHOTO B : VUE DU CLAVIER
— 3 -
1.3 UNITE CENTRALE
L'Oric est avant tout une machine à traiter l'infor-
mation. Elle reçoit, stocke, traite et communique des
données avec le clavier, un téléviseur couleur, ou avec
un magnétophone à cassettes.
UNITE
Clavier
Magnétophone
à cassettes
CENTRALE
Téléviseur couleur
FIGURE 1 : STRUCTURE DE L'ORIC
Le coeur de votre microordinateur est appelé unité
centrale (en anglais Central Processor Unit, ou
CPU en abrégé). Cette unité centrale supervise le
fonctionnement du système Oric tout entier.
Elle décide quand aller chercher les données au cla-
vier ou en envoyer sur l'écran, sur la cassette... Elle
exécute les programmes que vous lui demandez.
L'unité centrale est organisée autour d'un simple
circuit intégré (boîtier noir muni de pattes) appelé
microprocesseur. Ce boîtier fait les calculs, va chercher
les données et les range. Pour pouvoir travailler assez
rapidement, le microprocesseur ne va pas demander une à
une les données au clavier ; il a besoin pour cela d'au-
tres circuits, appelés mémoires, qui contiennent le pro-
gramme et la plupart des données utiles au programme.
Mémoire
RAM
Entrées
- Interface Microprocesseur
———
Sorties
Mémoire
ROM
FIGURE 2 : UNITE CENTRALE
Deux types de mémoire existent et sont représentées
sur la figure 2 :
- mémoire ROM (Read Only Memory) ou mémoire morte ;
- mémoire RAM (Random Access Memory) ou mémoire vive.
Une mémoire morte est un stock d'instructions, de
données... dont le contenu est permanent, n'est pas effa-
cé lorsque l'on coupe le courant, et qui contient, par
exemple, des programmes de communication avec le clavier.
Le contenu d'une mémoire morte de l'Oric est défini par
le constructeur de la machine et vous ne pourrez y tou-
cher.
- 5 -
Dans une mémoire RAM (ou vive), on peut écrire, lire
ou effacer de l'information aussi souvent qu'on le sou-
haite ; elle contiendra, par exemple, les programmes que
vous taperez, mais elle sera effacée par toute coupure du
courant.
Le microprocesseur de l'Oric est le même que celui de
l'Apple II ou du Vic 20. La taille des mémoires de l'Oric
«
peut varier de 16 000 à 48 000 caractères en mémoire
vive.
La mémoire morte contient l'équivalent de 16 000 ca-
ractères pour stocker le langage de programmation Basic
auquel nous vous initierons aux chapitres 2 et 3.
Dans la suite de ce livre, nous utiliserons le symbo-
le K pour représenter le chiffre 1024 (= 2 ).
Ainsi, par exemple, 16 k = 16.384 soit 16.000 envi-
ron.
La photo C, ci-dessous, montre l'intérieur de votre
Oric. Le microprocesseur, les mémoires RAM, les mémoires
ROM ainsi que le haut-parleur y sont clairement visibles.
ns
4
È
4!
;
sonne nnaennr
55:
Li
s.
+
ë
PHOTO C : STRUCTURE INTERNE DE L'ORIC
— 6 —
1.4 SORTIE VIDEO
Deux prises existent sur la face arrière de l'Oric
pour le relier à un téléviseur couleur :
Prise’ d'antenne
pour téléviseur Pal
Secam anglais
Prise Péritel
pour téléviseur
Vous disposez donc de deux options :
a. branchement sur l'entrée Péritel pour téléviseur
couleur
b. branchement sur l'entrée Prise d'antenne pour
téléviseur anglais.
La première solution vous donnera une qualité net-
tement meilleure que la seconde (couleurs, netteté...).
Si vous n'avez pas de prise Péritel sur votre télévi-
seur, il est tout à fait possible de la faire installer
par un revendeur spécialisé,
1.5 SORTIE CASSETTE
La connection se fait par l'intermédiaire d'une prise
DIN. C'est le format classique Tangerine qui est utilisé.
Les vitesses d'enregistrement vont de 40 à 300 caractères
par seconde. Un circuit spécial de l'Oric élimine les
bruits parasites. Tous les types d'informations peuvent
être sauvegardés (programmes, données, blocs mémoire...).
Il serait prématuré d'énumérer ici les commandes spé-
cifiques à l'interface cassette, attendu que vous n'avez
encore aucun programme ou exécution de programme à sauve-
garder sur cassette. Une annexe sera consacrée à ces com-
mandes (de même pour la sortie imprimante), et vous vous
y reporterez. Pour l'heure, nous nous contenterons d'une
description technique.
1.6 EXTENSIONS
Reportez-vous à la figure 1 de la page suivante.
Vous pouvez y voir, à côté du branchement imprimante, un
branchement pour extensions. Ces possibilités d'extension
sont des connexions de cartouches ROM par exemple, c'est-
à-dire que vous pouvez brancher une ligne pour étendre
les mémoires. Vous pouvez aussi connecter des cartouches
de jeux, un lecteur de disques, et bien sûr un modem (mo-
dulateur-démodulateur) qui transformera les signaux codés
constituant votre programme pour les rendre aptes au
transport par ligne téléphonique. C'est le système
Prestel Mailbox qui est utilisé.
1.7 MISE EN ROUTE
Oric n'est déjà plus un inconnu, mais il reste à le
mettre en route.
Vous vous trouvez devant :
— l'ordinateur, avec son clavier ;
- deux adaptateurs
. le plus gros sert à l'alimentation,
. le plus petit fournit un voltage indispensable
pour permuter la prise Péritel en mode vidéo. L'a-
limentation Péritel permet de sélectionner l'entrée
RVB parmi les trois entrées possible.
- une prise Péritel. Selon l'importateur d'Oric, la
prise Péritel peut intégrer le petit adaptateur
précédent.
Port d'extension
Branchement
téléviseur
sur prise
d'antenne Alimentation
Branchement de
l'imprimante
Prise 5 broches Prise 7 broches
Péritel pour cassette
téléviseur ou
moniteur
FIGURE ll
Sur l'extrémité de la prise Péritel correspondant au
récepteur, vous enfichez la prise en croix reliée au plus
petit des deux adaptateurs.
Oric n'a pas de touche ARRET/MARCHE.
Il faut couper
l'alimentation pour l'arrêter.
Vos branchements faits,
vous devez voir apparaître
sur l'écran :
ORIC EXTENDED BASIC VI1.C
(C) 1983 TANGERINE
..+. BYTES FREE
Ready
FIGURE 2
— 9 —
Voilà, vous êtes prêt à découvrir le monde de l'in-
formatique.
Que vos goûts vous conduisent vers les mathématiques,
la gestion, le dessin, la musique ou l'informatique en
elle-même, vous allez devenir plus efficace.
_— 10 -
CHAPITRE 2
Initiation
à la
programmation
2.1 INTRODUCTION
Si vous avez suivi les instructions du chapitre con-
cernant la mise en route, vous savez maintenant effectuer
rapidement les branchements nécessaires.
Voici donc l'appareil sous tension, convenablement
relié à votre récepteur de télévision. Si vous n'avez pas
fait d'erreur de branchement, vous voyez apparaître sur
l'écran, en noir sur fond blanc
ORIC EXTENDED BASIC VI1.0
(C) 1983 TANGERINE
47870(*) BYTES FREE
Ready
Si tel n'était pas le cas, reportez-vous au chapitre 1.
Le rectangle noir clignotant, qui apparaît sur le
bord supérieur gauche de l'écran, sous le mot Ready,
s'appelle le curseur. Il détermine l'emplacement du ca-
ractère que l'on veut écrire, et se déplace au fur et à
mesure sur la ligne.
(*) Ce nombre peut être inférieur, selon la version
d'Oric en présence.
— 11 -
Essayons par exemple de taper au clavier
BONJOUR
Le mot BONJOUR s'écrit sur l'écran au fur et à mesure
que nous le tapons. Oric va-t-il nous répondre ?
Nous avons terminé, et... il ne se passe apparemment
rien. En fait, pour qu'Oric prenne en compte une ligne
que l'on vient de taper, il faut le lui demander en ap-
puyant sur la touche marquée [RETURN].
Oric répond alors
? SYNTAX ERROR
Ready
Que s'est-il passé ? L'ordinateur a lu notre message,
a constaté qu'il n'était pas écrit suivant la “bonne”
syntaxe et nous a signalé le fait par un message d'er-
reur.
Tapons maintenant
PRINT "BONJOUR"
Pour taper les guillemets il faut enfoncer l'une des
touches [SHIFT]J, la maintenir, et appuyer en même temps
sur la touche marquée [,"]. De manière générale, il faut
procéder de la même façon pour obtenir le caractère du
haut sur les touches à double fonction.
Appuyons ensuite sur [RETURN].
En principe, tout message que vous taperez devra être
suivi de la touche [RETURN] ; nous vous le rappellerons
d'abord systématiquement puis, peu à peu, nous l'omet-
trons. Elle sera sous-entendue mais devra toujours être
tapée.
Si vous avez composé exactement les lettres ci-des-
sus, sans oublier les guillemets, vous obtenez immédiate-
ment sur l'écran
BONJOUR
Ready
— 12 -
Oric a imprimé BONJOUR et nous informe, en affichant
Ready, qu'il est prêt à enregistrer d'autres messages.
Nous voyons donc que pour communiquer avec Oric, il
faudra toujours taper nos messages en respectant rigou-
reusement une certaine syntaxe, qui fonde en fait un vé-
ritable langage.
Avant de voir plus précisément ce qu'est ce langage,
il faut introduire un certain nombre de notions :
2.1.1 Stockage de l'information - Bit - Octet
Oric est un microordinateur, dérivé des grands ordi-
nateurs qui fonctionnent actuellement dans le monde in-
dustriel. Mais ne nous y trompons pas : s'il a une taille
très réduite, son principe de fonctionnement est en tout
point semblable à celui de ses "aînés". Comme eux, c'est
une machine de traitement automatique de données.
Et une des opérations essentielles qu'Oric — comme
tout ordinateur -— doit pouvoir effectuer sur l'informa-
tion, est sa mémorisation.
A un autre niveau, c'est ce qui se passe lorsque vous
mettez un nombre en mémoire dans votre calculatrice de
poche.
La meilleure méthode que l'on connaisse actuellement
pour mémoriser une information est un codage binaire,
c'est-à-dire qui réduit tout élément à deux états
bien distincts. Ce peut être par exemple l'absence ou
la présence de trou dans une carte perforée, un élément
aimanté dans un sens ou dans l'autre.
Oric, lui, utilise des éléments de circuits électro-
niques qui peuvent être portés à une tension de 5V, ou
bien rester à O.
L'information contenue dans un tel élément s'appelle
BIT (abréviation de l'expression anglaise BINARY
DIGIT, qui signifie chiffre binaire) et contient en
quelque sorte la réponse par oui ou par non à une certai-
ne question.
Mais un seul BIT contient une information trop
“petite pour être manipulée aisément. C'est pourquoi on
les regroupe généralement par paquets de 8, ou
OCTETS.
11 y a une remarque intéressante à faire ici. On se
souvient qu'Oric, dès qu'on le met sous tension, affiche:
47870 BYTES FREE
Or en anglais OCTET se dit BYTE. Si l'on sait
que FREE signifie LIBRE, on voit que la mémoire
d'Oric a une capacité de 47870 octets.
En pratique, sachez que sur un octet il est possible
de représenter les nombres inférieurs à 256 ou les carac-
tères du clavier. Les autres nombres seront représentés
sur plusieurs octets.
Les lecteurs intéressés par ce codage peuvent lire la
suite de ce paragraphe. Les autres personnes passeront au
paragraphe 2.1.2.
Un octet étant un paquet de 8 bits, supposons que
l'on représente les deux états que peut prendre un
bit par O et 1. Un octet pourra alors s'écrire comme
une succession de huit O0 ou 1 ; par exemple 00100010,
ou 11101001... En fait, comme il y a deux possibili-
tés pour chaque bit, on a 256 possibilités différen-
tes pour un octet.
On peut maintenant comprendre comment un
OCTET pourra représenter un nombre : il suffit de
considérer que la suite de huit O0 ou 1 qui constitue
un octet est un nombre écrit dans le système de
numérotation binaire.
Ainsi 00100010 représentera
5
0 207-000 de fre 27 40
x 2 + 0 x
2. 002 Le DE Ox20 0137: 2e
2
Cela n'a absolument rien de mystérieux. Nous
faisons chaque jour la même chose lorsque nous écri-
vos un nombre en base dix. Par exemple 534 vaut 5 x
1024 3% l0 HAE 107
= JA =
Mais avec notre convention, on s'aperçoit que le
nombre le plus grand qu'on puisse écrire est 11111111
= 255. Pour pouvoir représenter des nombres plus
grands que 255, il faudra qu'un nombre occupe plus
d'un octet, mais le principe reste le même.
Stocker des nombres est donc finalement relative-
ment facile. Mais comment faire pour stocker des
lettres ou des caractères ? Là encore, rien de plus
simple. Il suffit de considérer par exemple les codes
ASCII où À = 01000001, B = 01000010, et ainsi de sui-
te pour toutes les lettres. Comme il y a 256 possi-
bilités dans un octet, on peut avoir un jeu de 256
caractères différents, ce qui permet de représenter
toutes les lettres, minuscules et majuscules, les
chiffres, les caractères de ponctuation, etc.
2.1.2 Notion de langage — Le Basic
Comme on peut le penser d'après la façon de stocker
l'information, le seul langage qu'Oric “comprenne” vrai-
ment est le langage binaire, composé d'une succession de
BITS, et qu'on appelle encore “langage machine".
Cela signifie-t-il que nous sommes obligés d'intro-
duire toutes nos commandes et instructions sous la forme
d'une succession de 0 et de 1 ? Heureusement non ! Ce se-
rait beaucoup trop compliqué à écrire et à comprendre (du
moins pour nous, mais pas pour la machine, qui est litté-
ralement infatigable).
Pour nous éviter cette peine, il existe ce que l'on
appelle des langages évolués. Ce sont d'autres langages
de programmation que le langage machine, mais qui sont
beaucoup plus proches du langage humain et des notations
mathématiques usuelles. Par suite, ils sont beaucoup plus
aisés d'emploi.
Il existe un certain nombre de tels langages, chacun
étant plus ou moins adapté à un usage spécifique. Parmi
les plus connus, on peut citer FORTRAN, COBOL, PASCAL,
PL1, ... et BASIC, qui est le langage employé par Oric.
BASIC est le langage actuellement le plus répandu sur
- 15 -
s
les microordinateurs. Sa très grande diffusion tient à sa
facilité d'apprentissage : BASIC est en effet le langage
le plus facile à apprendre et à utiliser par les débu-
tants.
Il a été créé en 1964 pour permettre l'apprentissage
facile de la programmation, et son nom est l'abréviation
de Beginner's All purpose Symbolic Instruction Code,
ce qui signifie : codage symbolique des instructions
d'usage général pour les débutants.
Nous savons donc qu'Oric “comprend” le BASIC ; ïil
nous reste maintenant à apprendre nous-même ce langage,
pour pouvoir utiliser notre microordinateur. C'est le but
des chapitres qui suivent. Nous verrons que ce n'est pas
très difficile, car BASIC est un langage bien plus facile
à apprendre qu'une langue étrangère : il ne comprend en
effet qu'une centaine de mots !
Remarquons que BASIC est susceptible de varier légè-
rement d'un microordinateur à l'autre, un peu de la même
façon, par exemple, qu'une langue est susceptible d'avoir
des variantes locales d'une région à l'autre.
Ce n'est pas grave dans la mesure où l'on programme
toujours sur le mêm microordinateur. Mais on peut être
amené à changer de machine. (Attention : tous les Orics
“parlent” bien le même BASIC ; les différences sont sen-
sibles entre des machines de constructeurs différents).
Aussi ce chapitre présente-t-il les instructions de base
communes à toutes les versions de BASIC. Les instructions
plus élaborées, ainsi que les instructions BASIC spécifi-
ques à Oric sont présentées dans le chapitre suivant.
2.2 MODE DIRECT -— MODE DIFFERE -— NOTION DE PROGRAMME
2.2.1 Introduction
Nous avons déjà rencontré une instruction BASIC,
c'est l'instruction PRINT. Comme son nom l'indique (en
anglais, PRINT signifie imprimer) elle permet d'écrire
sur l'écran. Son emploi est très simple. De la même façon
que nous avons su faire écrire BONJOUR, nous pourrons
écrire une ligne de texte quelconque en tapant cette li-
gne après PRINT, sans oublier de mettre des guillemets
(") de part et d'autre de la ligne de texte, comme dans
l'exemple suivant
_- 16 -
PRINT "CECI EST UNE LIGNE DE TEXTE"
Tapons maintenant :
PRINT 2 + 3
(Pour taper + il faut appuyer simultanément sur
[SHIFT] et sur la touche [+=]).
Appuyons sur [RETURN]
11 s'affiche alors immédiatement sur l'écran
5
Ready
Oric a effectué le calcul et a immédiatement imprimé
le résultat.
Ce mode de fonctionnement, dans lequel une instruc-
tion est exécutée immédiatement après avoir été tapée,
est dit “mode immédiat", ou “mode d'exécution immédiate”,
ou encore ‘mode direct".
C'est très proche du fonctionnement de votre calcula-
trice de poche où les calculs se font au fur et à mesure
que vous les rentrez. La seul différence, c'est qu'il
faut d'abord taper PRINT.
Nous y reviendrons. Avant cela, il faut voir le se-
cond mode de fonctionnement.
Tapons
20 PRINT 2 + 3
Appuyons sur [RETURN] ... cette fois, il ne se passe
rien !
Tapons encore
10 PRINT "BONJOUR"
Appuyons sur [RETURN] : toujours rien. Serait-ce une
panne ?
17
Mais tapons maintenant :
RUN
et appuyons sur [RETURN]. Il apparaît alors à l'écran :
BONJOUR
5
Ready
Expliquons ce qui s'est passé. Oric, au lieu d'exécu-
ter immédiatement les instructions, les a mises en mémoi-
re où elles constituent ce que l'on appelle un PROGRAMME.
En tapant RUN, nous avons signalé à Oric qu'il pou-
vait exécuter ce programme, c'est-à-dire exécuter les
instructions les unes après les autres. On dit qu'il a
un
fonctionné suivant le “mode différé”, ou “mode program-
mé", son second mode de fonctionnement.
Ce mode se caractérise par la présence d'un numéro en
tête de chaque ligne. C'est ce qui permet de déterminer
le mode dans lequel on se trouve, car, avec quelques ex-
ceptions, toutes les instructions utilisables en mode
programmé le sont aussi en mode direct.
Le numéro en tête de ligne a aussi une autre utilité.
I1 fixe l'ordre dans lequel seront exécutées les instruc-
tions. Nous avons pu remarquer en effet que la ligne 10 a
été exécutée avant la ligne 20, bien qu'elle ait été ta-
pée après. En mode programmé, l'ordre dans lequel on tape
les lignes n'a donc aucune importance ; Oric exécutera de
toute façon les instructions par ordre de numéros de li-
gne croissants.
Nous verrons bien vite que le mode de fonctionnement
le plus intéressant d'Oric est le mode programmé.
Néanmoins, pour mieux nous familiariser avec son fonc-
tionnement, nous allons nous intéresser d'abord au mode
direct.
2.2.2 Fonctionnement en mode direct
Nous allons, en fait, apprendre d'abord à nous servir
d'Oric comme d'une calculatrice de poche, en apprenant à
évaluer les expressions arithmétiques.
sA8"=
- Les opérations élémentaires
+ ADDITION
Nous savons déjà additionner : pour ajouter 12 à 27,
nous avons compris qu'il suffit de taper
PRINT 12 + 27
N'oublions pas d'appuyer sur [RETURN] (ce sera désor-
mais sous-entendu). Oric affiche aussitôt le résultat
39
Ready
Rappelons que READY (mot anglais pour PRET) si-
gnifie qu'Oric a terminé d'exécuter les instructions que
nous lui avions fournies et qu'il se tient prêt à enre-
gistrer de nouvelles commandes.
SOUSTRACTION
La soustraction ne fait pas plus de difficulté ; es-
sayons par exemple
PRINT 8 - 2.5
On obtient 5.5. Notons le point à la place de la vir-
gule. Oric, comme tous les ordinateurs, utilise la nota-
tion arithmétique anglo-saxonne, dans laquelle on écrit
12.25 au lieu de 12,25.
Supposons qu'à la ligne précédente, nous nous soyons
trompés et ayons tapé :
PRINT 8 - 2,5
Nous obtenons alors
6 5
Oric a considéré la virgule comme un séparateur entre
deux valeurs. Il comprend qu'il faut imprimer 8 - 2, soit
6, puis la valeur 5. Ce n'est pas du tout ce que nous
voulions obtenir, et cela nous montre combien il faut
être précis dans ce que nous tapons
Oric obéit à la lettre à ce que nous lui commandons.
_- 19 —-
Néanmoins, malgré tout le soin que nous apportons en
tapant nos messages, une erreur est toujours possible.
Comment faire pour la corriger ? Reprenons cet exemple :
PRINT 8 - 2,5
mais nous n'avons pas encore appuyé sur la touche
[RETURN ].
Pour corriger notre erreur, et remplacer la virgule
par un point, il faut utiliser la touche [DEL] : elle
permet de faire reculer le curseur.
Dans notre exemple, appuyons une fois sur [DEL] : le
curseur recule d'un cran et 5 disparaît. Appuyons une au-
tre fois, et la virgule disparaît. Nous pouvons alors ta-
per un point et retaper le 5 : notre erreur est réparée.
ATTENTION : Il ne faut pas utiliser la touche [e-|
; le curseur recule bien aussi, comme avec la touche
[DEL] ; on pourra même remplacer la virgule par un
point, et cela sans que le 5 s'efface ; mais en fait
ces modifications n'auront eu lieu que sur l'écran :
Oric ne les aura pas prises en compte.
L'usage de la touche [é—] et des touches analogues
sera abordé ultérieurement.
Si nous avons fait beaucoup d'erreurs dans la même
ligne et que nous préférons la retaper entièrement, nous
pouvons appuyer simultanément sur [CTRL] et sur [X]. Le
caractère \ apparaît au bout de la ligne, dont il ne sera
plus tenu compte : bien qu'elle soit toujours imprimée
sur l'écran, Oric considère la ligne comme effacée.
Nous pouvons alors la retaper car, simultanément avec
l'apparition du caractère \ , le curseur a sauté au début
de la ligne suivante.
+ MULTIPLICATION
Le symbole de la multiplication est * (qu'on obtient
en appuyant simultanément sur les touches [SHIFT] et
[8]).
PRINT 4 * 16
donne 64
— 20 -
Peut-être trouvez-vous un peu fastidieux de taper les
cinq lettres du mot PRINT avant chaque opération ? En
fait, il suffit de taper [?] au lieu de PRINT. C'en est
en quelque sorte une abréviation qui accélère la frappe.
Oric comprend les deux termes de la même façon. Dans la
suite, nous utiliserons indifféremment ? ou PRINT.
+ DIVISION
Pour effectuer une division, le symbole est / qui se
prononce SLASH.
Essayons
% 2/3
N'oublions pas d'appuyer sur [RETURN] !
On obtient :
.666666667
Le zéro avant le point décimal est omis, mais on
pourra remarquer qu'il est barré pour ne pas le confondre
avec la lettre O.
+ PUISSANCE
Il reste une dernière opération élémentaire, très
utile, l'élévation à la puissance. Son symbole est T (que
l'on obtient par [SHIFT] [6]).
PRINT 4 1 3
3
donne 64 (= 4°).
On peut ainsi obtenir par exemple la racine carrée
par :
? 25 1 0.5
qui donne 5
Signalons qu'il existe une autre possibilité : la
fonction SQR. On l'utilise de la façon suivante :
? SQR (25)
Elle donne aussi la racine carrée, mais le calcul en
est plus rapide.
— 21 -
- Les ordres de priorité des opérateurs
Nous avons donc découvert les 5 opérations mathémati-
ques fondamentales :
LE nr ue 6 À
Mais nous n'avons vu que des exemples très simples.
On peut calculer des expressions plus compliquées conte-
nant plusieurs opérateurs. Essayons les quelques exemples
suivants :
?25+3*%24
28:26:02
2 5% 68 /-&
22*37T2
Le premier a pour résultat 17 (= 5 + 12) et non pas
32 (= 8 * 4) car Oric évalue d'abord la multiplication.
On dit que la multiplication est prioritaire sur l'addi-
tion.
De même, la deuxième expression donne 5 : on évalue
d'abord la division.
Pour la troisième, on obtient 10 : les calculs sont
effectués dans l'ordre où ils se présentent, car * et /
ont même priorité.
Enfin le quatrième exemple a pour résultat 18 :
l'élévation à la puissance est effectuée en premier car
elle est prioritaire sur la multiplication.
Pour nous résumer, il faut retenir que les calculs
sont effectués de gauche à droite, sauf s'il y a des
priorités à respecter entre les divers opérateurs. Ces
priorités sont les suivantes :
est toujours effectué en premier, puis
qui ont la même priorité, et enfin
qui sont aussi “ex aequo".
+ + —
à
Pour changer l'ordre de priorité, on emploie des
parenthèses, car une expression entre parenthèses est
toujours évaluée la première. Par exemple :
— 22 —
(4 + 3) * 2 donne 14 alors que 4 + 3 * 2 donne 10
(2 * 3) T 2 donne 36 alors que 2 * 3 T 2 donne 18
7 - (3 + 2) donne 2 alors que 7 - 3 + 2 donne 6
Il peut y avoir des parenthèses emboîtées, mais
alors il faut veiller à ce qu'il y ait bien autant de pa-
renthèses ouvrantes “(" que de parenthèses fermantes "“})",
pour que l'expression ait un sens.
Les parenthèses emboîtées suivent la règle de la plus
intérieure vers la plus extérieure, et de la gauche vers
la droite.
Ainsi,
(& +2) #37 (7 - (3 + 2)) est correct.
Mais ((8 - 6) * ((3 - 2) T 6) / 2
provoquera un
? SYNTAX ERROR
- Notion de variable
Au stade où nous en sommes, nous savons évaluer des
expressions, même très compliquées, mais tout ce que nous
pouvons en faire, c'est faire imprimer leur valeur sur
l'écran.
En fait, il est possible de mettre ces valeurs en mé-
moire pour les utiliser ultérieurement. Comment faire ?
Eh bien, il suffit de donner un nom à l'expression que
l'on veut mettre en mémoire, comme sur cet exemple :
B=2+3
Même après avoir appuyé sur [RETURN], il n'apparaît
rien d'autre que Ready sur l'écran. Oric a calculé
l'expression et lui a attribué automatiquement un
emplacement en mémoire qu'il a nommé B.
On dit que l'on a constitué une variable de nom B.
On peut maintenant utiliser cette variable dans d'au-
tres expressions ; tapons
_- 23 -
PRINT B
nous obtenons
Tapons
PRINT 3 * B
nous obtenons
15
Nous pourrions imaginer ainsi un grand nombre d'ex-
pressions, utilisant la variable B, mais sa valeur ne
sera jamais détruite (c'est-à-dire qu'elle ne sera jamais
effacée de la mémoire) sauf lors d'une nouvelle instruc-
tion d'affectation ; si nous tapons
B = 3
alors PRINT B + 1
donne 4
REMARQUE : Au lieu de taper B = 3 nous aurions pu
écrire LET B = 3 (ce qui signifie “affecter à B la
valeur 3"). Ces deux formes sont absolument équiva-
lentes, Oric ne fera pas de différence. En fait, il
est plus simple de taper B = 3 ; si nous signalons
l'instruction LET c'est que, avec certains BASIC
implantés sur d'autres microordinateurs, cette ins-
truction est obligatoire, ce qui n'est pas le cas
pour Oric.
Nous avons considéré la variable B, mais nous aurions
pu aussi l'appeler C, ou A, ou NOMBRE.... En fait les
noms des variables sont pratiquement arbitraires. Il suf-
fit de respecter les 3 règles suivantes
- Le premier caractère doit être une lettre : A, B ... Z
- Les caractères suivants peuvent être des lettres ou des
chiffres (Ex : B2, NOMBRE, K12J4...).
a 94 =
- Le nom de la variable ne doit pas contenir un des mots
particuliers au langage BASIC, qu'on appelle MOTS-CLES.
Appeler une variable LETTRE est interdit, car il y a
LET, mot-clé que nous venons de voir. De même CHIFFRE
n'est pas utilisable, car il contient IF, mot-clé que
nous verrons par la suite.
La liste complète de ces mots-clés est donnée en annexe
A.
Une précision importante à retenir, car elle peut
être la source de nombreuses erreurs, est la suivante
Quel que soit le nombre de caractères que comporte le
nom d'une variable, Oric ne prend en compte que les
deux premiers.
Des variables distinctes comme NOMBRE et NOM sont
considérées comme identiques, car les 2 premières lettres
sont semblables.
Alors, si nous tapons
NOMBRE = 2
NOM = 10
et si ensuite nous faisons
PRINT NOMBRE
nous obtenons
10
et non pas 2. En faisant NOM = 10, Oric a remplacé la va-
leur 2 qu'avait la variable "NO" (seules lettres qu'a
“vues” Oric) par la valeur 10. En faisant écrire NOMBRE
(c'est-à-dire pour Oric, toujours la variable “NO") nous
avons naturellement obtenu la dernière valeur entrée.
Nous sommes maintenant armés pour aborder le mode
programmé, ce qui devrait se révéler plus intéressant que
ce qui précède, peut-être un peu rébarbatif, mais absolu-
ment nécessaire.
_- 25 -
2.3 LES BASES DE LA PROGRAMMATION
— DECOUVERTE DU LANGAGE BASIC
2.3.1 Le premier programme
Nous savons déjà ce qu'est un programme ; nous avons
vu que c'est un ensemble d'instructions, dont chaque li-
gne comporte un numéro en tête, et qui sont mises en mé-
moire.
On lance l'exécution en tapant RUN ; les instructions
sont alors exécutées les unes après les autres, par ordre
de numéros de ligne croissants.
Notre premier programme va être très simple. Il a
simplement pour but de calculer la circonférence C d'un
cercle de diamètre D (C = D).
10 INPUT D
20 C= PI * D
30 PRINT C
Malgré sa simplicité, ce petit programme comporte les
étapes fondamentales de tout traitement d'information :
. L'ACQUISITION DES DONNEES à la ligne 10. Nous y dé-
couvrons un nouveau mot de BASIC : INPUT. Son effet est
le suivant : lorsque nous lancerons le programme en ta-
pant RUN, Oric affichera un ?, suivi du curseur cligno-
tant. Il attendra ensuite que nous tapions un nombre (qui
sera le diamètre du cercle). Supposons que nous tapions
la valeur 2 (suivie comme toujours de [RETURN]). Oric af-
fectera cette valeur à D, puis passera à la ligne suivan-
te où sera effectué :
+ LE TRAITEMENT DES DONNEES à la ligne 20. Il est
évidemment très réduit ici ; on effectue simplement la
multiplication de D (qui vaut maintenant 2) par PI (=).
Cette dernière valeur est “connue” par Oric. Nous pour-
rons nous en assurer en tapant ultérieurement, en mode
direct :
PRINT PI
et nous obtiendrons :
3.14159265
_— 26 -
Après le traitement des données, c'est-à-dire le cal-
cul des résultats, vient la dernière étape
+ LA SORTIE DES RESULTATS à la ligne 30 où l'on affi-
che la valeur de la circonférence (ici 6.2831853) grâce à
l'instruction PRINT, que nous connaissons bien mainte-
nant.
Si vous avez bien suivi ces trois étapes du fonction-
nement d'un programme, le reste ne posera pas de problè-
me, car pratiquement toute la méthode de la programmation
est contenue dans ces quelques lignes.
Notre petit programme est susceptible d'être amélio-
ré, bien qu'il fonctionne parfaitement : pour connaître
la circonférence d'un cercle de diamètre donné il suffit
de taper RUN, puis, après le point d'interrogation qui
apparaît alors, de taper le diamètre du cercle ; la cir-
conférence s'affiche immédiatement après qu'on a enfoncé
la touche [RETURN].
Si l'on veut la circonférence d'un cercle de diamètre
différent, il suffit de retaper RUN et le programme est
réexécuté. Et il le sera autant de fois qu'on retapera
RUN : cela n'usera pas le programme de le faire exécuter,
il restera toujours en mémoire (sauf si on débranche
Oric)!
Quelles sont les améliorations que l'on aïmerait ap-
porter ? Tout d'abord, il y a un problème à l'entrée des
données. En effet, l'instruction INPUT provoque l'affi-
chage d'un ? seul. Nous savons qu'il faut alors taper la
valeur du diamètre du cercle, mais nous le savons unique-
ment parce que nous avons écrit le programme... Autre-
ment, rien ne nous l'indique, et une personne qui ne con-
naîtrait pas le programme ne saurait pas quoi taper après
le ?.
11 faudrait qu'Oric indique, par un message avant le
?, que c'est le diamètre du cercle qu'il faut taper et
pas autre chose.
Cela peut sembler inutile ici, car le programme est
simple, mais imaginons un très gros programme qui compor-
terait de nombreux INPUT. Même si nous l'avions nous-même
écrit, il ne serait pas inutile qu'il nous rappelle dans
quel ordre entrer les données.
- 27 -
Cela s'obtient très facilement, car l'instruction
INPUT peut aussi s'employer sous la forme suivante
INPUT “texte” ; variable
Le texte entre guillemets apparaît alors, suivi d'un
point d'interrogation. Il suffit ensuite de taper la va-
leur demandée, qui est affectée à la variable.
Dans notre programme, nous aurons résolu notre pro-
blème en remplaçant la ligne 10 par :
10 INPUT "QUEL EST LE DIAMETRE DU CERCLE" ; D
La syntaxe doit être scrupuleusement observée ; en
particulier les guillemets de part et d'autre du texte,
ainsi que le point-virgule entre ce dernier et la varia-
ble sont absolument obligatoires.
Mais nous n'avons résolu un problème que ‘pour en fai-
re surgir un autre. Car comment remplacer la ligne 10
dans notre programme ? En fait, c'est tout simple, il
suffit de taper la nouvelle ligne 10, sans oublier le nu-
méro. L'ancienne ligne 10 sera alors effacée de la mémoi-
re d'Oric où se trouve le programme, et remplacée par la
nouvelle ligne.
Cette remarque est très générale : pour remplacer une
ligne dans un programme, il suffit simplement de la reta-
per, sans oublier son numéro au début.
Le problème à l'entrée des données est donc résolu,
mais la situation est analogue lors de l'impression des
résultats : on obtient un nombre, mais rien n'indique
qu'il s'agit de la circonférence du cercle dont nous
avons entré le diamètre. Là encore, ce n'est pas très
grave, puisque nous savons ce dont il s'agit ; mais si
notre programme imprimait de nombreux résultats, il se-
rait absolument indispensable de les identifier.
Comment, donc, faire imprimer un message indiquant la
nature du nombre affiché ? Cela se fait très simplement
grâce à l'instruction PRINT. Nous savions déjà faire af-
ficher un texte, en l'entourant par des guillemets ; en
faisant suivre le texte entre guillemets par une virgule,
— 28 -
elle-même suivie de la variable, nous obtiendrons le ré-
sultat voulu.
Dans notre cas, on pourra taper par exemple
30 PRINT “LA CIRCONFERENCE DU CERCLE EST ", C
Dès lors notre programme est beaucoup plus aisé à
utiliser : tapons RUN.
Il apparaît
QUEL EST LE DIAMETRE DU CERCLE ?
Tapons un diamètre de 10 ;
Appuyons sur [RETURN] ; on obtient
LA CIRCONFERENCE DU CERCLE EST 31.4159265
Ready
Si nous voulons déterminer la circonférence d'un au-
tre cercle, il suffit de retaper RUN et le programme se
réexécutera.
2.3.2 Instruction GOTO
Néanmoins, si nous avions beaucoup de circonférences
à calculer, ce serait plus agréable de ne pas avoir à ta-
per RUN à chaque fois. Une nouvelle instruction BASIC va
nous offrir cette possibilité : l'instruction GOTO.
Tapons
40 GOTO 10
L'effet de cette ligne, ajoutée en fin de programme,
est de dire à Oric : “va à la ligne numéro 10" (en an-
glais “go to" signifie “allez à").
_ 29 -
Que va-t-il alors se passer ? Après avoir calculé la
circonférence et avoir imprimé le résultat, Oric arrive à
cette ligne 40, qui lui dit de retourner à la ligne 10,
ce qu'il fait. Il se retrouve donc en début de programme
et recommence à l'exécuter, c'est-à-dire qu'il affiche à
nouveau :
QUEL EST LE DIAMETRE DU CERCLE ?
C'est exactement ce que nous voulions obtenir !
Une telle structure, où un groupe d'instructions est
répété plusieurs fois, s'appelle une boucle. C'est une
notion très importante, dont nous verrons d'autres va-
riantes, et qui permet à l'ordinateur d'effectuer des
calculs itératifs.
2.3.3 Commande LIST
Notre programme ne comporte que 4 lignes, et il est
donc aisé de s'en souvenir. Mais pour des programmes plus
longs il sera indispensable de pouvoir faire imprimer les
instructions telles qu'elles sont stockées en mémoire.
C'est ce que permet la commande LIST, qui fait “lister”
le programme en mémoire. Essayons et tapons
LIST
Au stade où nous sommes nous obtenons
10 INPUT "QUEL EST LE DIAMETRE DU CERCLE" ; D
20C=PI*D
30 PRINT "LA CIRCONFERENCE DU CERCLE EST ", C
4O GOTO 10
Ready
Cette commande LIST sera revue ultérieurement et com-
plétée. Pour le moment, revenons à notre programme. IL a
encore un très gros défaut, il ne s'arrête jamais ! Indé-
finiment il affichera
QUEL EST LE DIAMETRE DU CERCLE ?
En fait , notre programme est un “mauvais programme”,
- 30 -
car il comporte une boucle indéfinie, ce qui ne devrait
jamais se produire. Un bon programme doit être prévu pour
se terminer de lui-même au bout d'un temps fini.
Nous verrons par la suite comment mettre en place des
boucles dont on soit sûr qu'elles se terminent.
2.3.4 CTRL C -— CONT
En attendant, il nous faut savoir comment arrêter no-
tre programme. Supposons que l'exécution soit en cours et
qu'Oric demande :
QUEL EST LE DIAMETRE DU CERCLE ?
Si à ce moment là, nous avons terminé avec le calcul
des circonférences, il suffira, pour stopper l'exécution,
d'appuyer simultanément sur la touche [CTRL] et la touche
[C]:
Oric affiche alors
Ready
Nous avons réussi à stopper l'exécution !
[CTRL] [C] est utile dans tous les cas où un pro-
gramme ne s'arrête pas de lui-même ; mais son effet est
légèrement différent lorsqu'on l'emploie alors que le
programme n'est pas en attente sur INPUT (par exemple si
le programme est en train d'effectuer de longs calculs).
On obtient
BREAK IN numéro de ligne
Ready
Le numéro de ligne qui apparaît après BREAK IN est
celui de la ligne où en était le programme lorsqu'on a
tapé [CTRL] [C].
Pour relancer l'exécution, on peut bien sûr taper
RUN, mais aussi :
CONT (abréviation de CONTINUER)
_— 31 —
Le programme redémarre alors à partir de la ligne où
a eu lieu le BREAK et non pas, comme avec RUN, depuis le
début.
Une autre différence avec RUN est que les valeurs des
variables sont conservées. On peut donc, par exemple,
après un BREAK, faire afficher les variables en mode di-
rect pour connaître l'état du programme, puis reprendre
l'exécution où elle en était par CONT.
ATTENTION : Si l'on apporte une modification au
programme, la reprise de l'exécution devra impérati-
vement se faire par RUN (et on recommencera donc de-
puis le début). Si on tape CONT, on aura le message
d'erreur :
? CAN'T CONTINUE ERROR
2.3.5 RESET
Dans certains cas, pourtant, [CTRL] [C] se révèle
inopérant ; on n'arrive plus à reprendre la main.
On peut alors bien sûr débrancher Oric, puis le re-
brancher, mais tout ce qui était en mémoire est perdu, et
en particulier le programme, qu'il faut alors retaper.
Une solution moins brutale consiste à appuyer sur la
touche RESET. Vous ne la trouverez pas sur le clavier :
c'est un petit bouton carré, noir, situé sur l'autre face
d'Oric. Pour y appuyer, il faut un crayon ou tout autre
objet effilé, car ce bouton est en renfoncement.
Son effet est le suivant : toute exécution en cours
est arrêtée, toutes les variables sont remises à zéro ;
l'appareil est ramené à son état initial, l'état où il se
trouve lorsqu'on vient de le brancher, avec la différen-
ce, néanmoins, que le programme est toujours en mémoire.
Avant de poursuivre et découvrir de nouvelles ins-
tructions et commandes, nous allons récapituler ce que
nous avons appris sur les instructions INPUT et PRINT, en
ajoutant quelques compléments, car ces deux instructions
sont fondamentales. Ce sont les commandes d'entrées-sor-
ties par excellence, celles qui permettent le mieux de
communiquer avec l'ordinateur, et à l'ordinateur de nous
répondre.
— 32 -
2.3.6 Instruction INPUT
. Une ligne d'instruction de la forme :
numéro de ligne INPUT variable
provoque l'apparition d'un point d'interrogation, avec
mise en attente du programme jusqu'à ce qu'on tape un
nombre. La valeur tapée sera alors affectée à la va-
riable.
. Pour préciser la nature du nombre à entrer, on peut
ajouter un texte :
numéro de ligne INPUT “texte” ; variable
Le texte s'imprime alors, suivi d'un point d'interroga-
tion.
. Il est possible d'entrer plusieurs variables dans
un même INPUT, avec la syntaxe suivante :
numéro de ligne INPUT "texte" ; variable 1, variable 2
Exemple : Imaginons un programme qui nécessiterait
l'entrée d'une date (par exemple pour calculer le nombre
de jours entre deux dates). Il pourrait comporter l'ins-
truction suivante :
numéro de ligne INPUT "ANNEE, MOIS, JOUR" ;
A, M, J
Notons les virgules entre les variables, et le point-
virgule qui sépare le texte des variables.
A l'exécution, on obtiendra :
ANNEE, MOIS, JOUR ?
Il faudra alors taper 3 nombres, séparés par une vir-
gule :
ANNEE, MOIS, JOUR ? 1789, 7, 14
et ne pas oublier d'appuyer sur [RETURN], comme d'habi-
tude.
— 33 -
. Que se passe-t-il si au lieu de taper trois nom-
bres, nous n'en tapons que deux et appuyons sur [RETURN]
en oubliant le troisième ? Eh bien, Oric va prendre en
compte les deux valeurs, s'apercevoir qu'il lui en faut
encore une, et afficher un double point d'interrogation
pour signaler qu'il manque des données.
ANNEE, MOIS, JOUR ? 1789, 14 [RETURN]
27.7
On peut donc rentrer les données groupées comme l'on
veut car, tant qu'Oric n'aura pas le nombre de données
nécessaire, il affichera ??.
. Si au contraire nous tapons plus de données que né-
cessaire, Oric ne prendra en compte que les n premières
(s'il attend n données) et ignorera les suivantes (super-
flues) en signalant le fait par le message EXTRA IGNORED.
ANNEE, MOIS, JOUR ? 1789, 14, 7, 18, 2
EXTRA IGNORED
Si nous ne tapons aucune donnée et faisons directe-
ment [RETURN], Oric, s'apercevant qu'aucune donnée n'a
été tapée, nous demandera d'entrer une valeur, en affi-
chant un point d'interrogation.
ANNEE, MOIS, JOUR ? [RETURN]
?
Si nous refaisons [RETURN], nous aurons un nouveau ?
jusqu'à ce que nous tapions un nombre.
ATTENTION : Si nous faisons [RETURN] après un ??,
Oric considérera que nous avons tapé 0.
2.3.7 Instruction PRINT
Pour imprimer une variable :
PRINT B
Pour imprimer un texte :
PRINT “texte”
— 34 —
Pour imprimer une variable en précisant sa nature
PRINT "texte", B
On peut faire imprimer plusieurs variables par un mê-
me ordre PRINT, mais on a deux possibilités : on peut sé-
parer les variables soit par des virgules, soit par des
points-virgules. Quelle est la différence ?
Si l'on sépare deux variables par une virgule, la
deuxième sera imprimée séparée de quatre blancs de la
première variable. Si on utilise un point-virgule les
deux variables seront imprimées côte à côte, séparées par
un seul blanc.
Essayons et tapons :
B = 7
C = 13
PRINT B, C
7 13
PRINT B; C
7 13
Le principe est le même avec des chaînes de caractè-
res ; la seule différence est que deux chaînes de carac-
tères séparées par un point-virgule seront imprimées
jointivement.
Par exemple :
PRINT "BON" ; "JOUR"
donne
BONJOUR
mais
PRINT "BON", "JOUR"
donne
BON JOUR
De plus, il est possible de préciser le nombre de
blancs entre deux chaînes de caractères.
_— 35 -
Si l'on veut par exemple que BON et JOUR soient sépa-
rés par douze blancs, on écrira :
PRINT "BON" SPC(12) "JOUR"
I1 suffit donc d'intercaler SPC(N) entre deux chaînes
de caractères pour qu'elles soient séparées par N blancs.
N doit être un nombre compris entre 0 et 255.
Pour en finir avec l'ordre PRINT, rappelons que l'on
peut utiliser ? comm abréviation et signalons enfin que
l'on peut terminer un ordre PRINT par un point-virgule,
alors qu'il n'y a rien à séparer. Le prochain PRINT écri-
ra alors sur la même ligne, comme le montre l'exemple
suivant
10 PRINT “BON"';
20 PRINT "JOUR"
RUN
donne BONJOUR
Ready
2.4 COMMANDES FONDAMENTALES
Avant de découvrir d'autres programmes, de tailles
plus importantes, il est indispensable d'aborder les dif-
férentes commandes qui permettent la manipulation de ces
programmes.
Nous avons déjà vu la commande LIST, qui permet de
"lister" un programme, et sur laquelle nous allons reve-
nir. Mais un programme doit aussi pouvoir être corrigé,
modifié ; on doit pouvoir en chercher les erreurs... etc.
Nous verrons les commandes qui permettent tout cela.
2.4.1 Connaître le contenu d'un programme : la commande
LIST
Cette commande, que nous avons déjà rencontrée, four-
nit sur l'écran la copie du programme en mémoire, qu'on
appelle la liste, ou en franglais le listing.
+ 96.=
Si le programme est très long et ne tient pas tout entier
sur l'écran, le “listing” va défiler, une ligne dispa-
raissant en haut de l'écran, une nouvelle apparaissant en
bas. La vitesse de défilement étant assez rapide, la
lecture est assez difficile.
Aussi peut-on stopper le défilement en appuyant sur
la barre d'espacement du clavier. Ensuite en appuyant sur
n'importe quelle touche, le défilement reprend. Vous pou-
vez essayer, mais les programmes que nous avons écrits
jusqu'à maintenant sont un peu courts pour que cela se
voie bien.
En ‘“listant"” un programme, on constate que les ins-
tructions apparaissent dans l'ordre des numéros crois-
sants, c'est-à-dire dans le même ordre que pour l'exécu-
tion, quel que soit l'ordre dans lequel elles ont été
tapées. De plus, si en tapant nos instructions nous avons
utilisé ? à la place de PRINT, sur le listing c'est le
mot PRINT qui apparaît.
Au lieu de lister un programme d'un seul coup, il est
possible de n'en visualiser que certaines parties :
Ainsi, pour lister une ligne x donnée, il suffit de
préciser ce numéro après LIST. Exemple (nous supposons
notre programme de calcul de circonférence toujours en
mémoire) :
LIST 20
20 C=PI*D
Pour lister toutes les instructions comprises entre
deux numéros x et y, il suffit de taper LIST x-y :
LIST 20-30
20 C=PI*D
30 PRINT "LA CIRCONFERENCE DU CERCLE EST ", C
Si l'on avait tapé LIST 25-38 on aurait obtenu la même
chose, car, dans notre exemple, il n'y a aucune ligne
entre 25 et 20, ni 30 et 38.
Pour lister toutes les lignes du début jusqu'à la li-
gne x il faut taper LIST -x :
AT
LIST -20
10 INPUT “QUEL EST LE DIAMETRE DU CERCLE"; D
20 C= PI * D
De la même façon LIST x- liste toutes les lignes de
la ligne x jusqu'à la fin
LIST 30-
30 PRINT "LA CIRCONFERENCE DU CERCLE EST ", C
4O GOTO 10
Si l'on veut arrêter définitivement de lister un pro-
gramme en train de défiler sur l'écran, il faut appuyer
simultanément sur [CTRL] et [C], comme pour arrêter
l'exécution d'un programme. Il apparaît alors
BREAK
Ready
2.4.2 Pour effacer un programme : commande NEW
Supposons qu'un programme soit en mémoire. Si nous
tapons NEW en mode direct, tout le contenu de la mémoire
sera effacé. Nous pouvons nous en assurer en utilisant la
commande LIST : si après NEW nous tapons LIST, nous obte-
nons simplement
Ready
preuve qu'aucun programme ne se trouve plus en mémoire.
Il est conseillé d'utiliser la commande NEW avant de
taper un nouveau programme, pour effacer l'ancien.
En effet, imaginons que nous commencions à taper un
nouveau programme sans avoir effacé l'ancien ; deux cho-
ses peuvent alors se produire : soit le numéro de la
ligne que nous tapons existait déjà dans l'ancien pro-
gramme, auquel cas la ligne que nous tapons ira remplacer
l'ancienne, qui sera par là même effacée, soit ce numéro
n'était pas dans l'ancien programme. Dans ce cas la ligne
ira s'intercaler à la place impliquée par son numéro.
Nous comprenons donc que si les numéros des lignes
que nous tapons ne correspondent pas un à un à ceux de
l'ancien programme, il restera des instructions anciennes
= 48e
non effacées, qui perturberont l'exécution du programme.
D'où l'intérêt de la commande NEW, qui supprime cet in-
convénient.
2.4.3 Pour lancer l'exécution d'un programme :
commande RUN
Nous avons déjà rencontré la commande RUN qui permet
de lancer l'exécution d'un programme. Il est possible
d'utiliser cette commande sous la forme RUN x où x est un
numéro de ligne, le programme s'exécutant à partir de
cette ligne numéro x.
11 existe une autre façon d'obtenir le même résultat:
on peut taper, en mode direct
GOTO x
et là aussi le programme commencera à partir de la ligne
Xe
Il y a pourtant une différence : avec RUN, toutes les
variables sont automatiquement mises à zéro, ce qui n'est
pas le cas avec GOTO.
Exemples : tapons
10 B = 45
20 PRINT B
Alors | RUN RUN 20 ( B }) B = 7 ( B )
( est ) GOTO 20 (reste)
(mis à) ( à )
( 0 ) C7)
donne| 45 donne |O donne |7
Il est possible de remettre les variables à zéro en
tapant CLEAR.
Dans l'exemple précédent,
B = 7
CLEAR (B est mis à 0)
GOTO 20
donne 0
= age
2.4.4 Pour terminer un programme : instructions STOP et
END
Jusqu'à maintenant nos programmes (du moins ceux qui
n'avaient pas de boucles indéfinies) se terminaient en
arrivant à leur dernière ligne.
Mais supposons que notre programme comporte plusieurs
parties et que nous voulions lancer tantôt l'une tantôt
l'autre, grâce par exemple à RUN x ; si nous lançons la
première partie, rien ne signale à ORIC la fin de cette
partie. Il va donc continuer en exécutant la deuxième
partie.
Pour éviter cela, il faut terminer chaque partie par
STOP ou END.
Ces deux instructions ont un effet sensiblement iden-
tique : en arrivant sur END ou STOP, le programme se ter-
mine et revient en mode direct. La seule différence est
qu'avec END il s'affiche simplement
Ready
alors qu'avec STOP il s'affiche
BREAK IN numéro de ligne
Ready
Le numéro est celui de la ligne où se trouve le STOP.
S'il y a plusieurs STOP dans le programme, on peut ainsi
,
savoir où il s'est arrêté.
Traditionnellement, l'instruction END est plutôt pla-
cée à la toute dernière ligne de programme. Le END n'a
pas plus de raison d'être à la fin qu'au début d'un pro-
gramme. Cela dépend uniquement de la structure organique
du programme.
2.4.5 Corrections et modifications de programmes
— INSERTION D'UNE LIGNE
Si nous voulons insérer une instruction entre les li-
gnes 50 et 60 par exemple, il suffit de taper
55 instruction
40
L'instruction viendra s'insérer à la ligne 55, entre
les lignes 50 et 60. Mais nous voyons que cela n'est pos-
sible que parce que les numéros des lignes ne sont pas
consécutifs. C'est pour cela qu'on a l'habitude (et c'est
une bonne habitude à prendre !) de taper un programme en
numérotant les lignes de 10 en 10 ; cela permet les in-
sertions ultérieures. Naturellement, on pourrait aussi
numéroter de 20 en 20 ou de 100 en 100, mais l'expérience
montre que la numérotation de 10 en 10 est la plus prati-
que.
— SUPPRESSION D'UNE LIGNE
Comme nous l'avons déjà vu, il suffit de taper son
numéro, suivi de [RETURN].
- MODIFICATION COMPLETE D'UNE LIGNE
Nous savons aussi que pour modifier complètement une
ligne, il suffit de la retaper, précédée de son numéro.
L'ancienne version est effacée et remplacée par la nou-
velle.
— MODIFICATION DE QUELQUES CARACTERES SUR UNE LIGNE
Supposons qu'en faisant lister notre programme nous
nous apercevions que nous avons fait une erreur dans une
ligne, par exemple
30 PRINT "LA CIRCONGERENCE DU CERCLE EST ", C
Une première solution consiste à retaper entièrement
la ligne, mais c'est fastidieux si la ligne est un peu
longue.
La bonne solution est la suivante : il faut d'abord
faire lister la ligne défectueuse sur l'écran, par exem-
ple ici par
LIST 30
BH 30 PRINT "LA CIRCONGERENCE DU CERCLE EST ", C
11 faut ensuite amener le curseur au début de la li-
gne comme indiqué ci-dessus, grâce aux touches de mouve-
ment du curseur :
[æ] [41 LŸ1 [—+]
_- 41 —
On appuie simultanément sur [CTRL] [A]. Le curseur
avance alors vers la droite ; on l'amène ainsi jusqu'au
caractère erroné, ici le G :
30 PRINT "LA CIRCONSERENCE DU CERCLE EST ", C
(Pour cela on maintient la touche [CTRL] enfoncée et
l'on appuie sur [A] autant de fois que nécessaire pour
placer le curseur).
On tape alors un F, puis on réappuie sur [CTRL] [A]
pour faire parcourir au curseur le reste de la ligne
30 PRINT "LA CIRCONFERENCE DU CERCLE EST ", C8
On appuie ensuite sur [RETURN] : la modification est
alors prise en compte.
ATTENTION : L'effet de la touche [CTRL] [A] est
de placer dans une petite mémoire intermédiaire les
caractères rencontrés sur l'écran par le curseur. Si
nous avions fait [RETURN] après avoir tapé le F, les
caractères suivants n'auraient pas été pris en com-
pte. En faisant
LIST 30
nous aurions obtenu
30 PRINT "LA CIRCONF
S'il y a plusieurs caractères erronés sur la même li-
gne, il suffit de les corriger de la même façon, au
fur et à mesure que le curseur se positionne sur ces
caractères.
2.5 CREEZ VOTRE JEU EN BASIC
2.5.1 Présentation du jeu
Jusqu'à maintenant nous avons vu quelques instruc-
tions fondamentales du BASIC, et les commandes indispen-
sables à l'élaboration des programmes. Néanmoins, nous ne
sommes pas capables d'écrire des programmes très élabo-
rés, car notre vocabulaire BASIC est encore assez limité.
SAT
Dans cette partie nous allons découvrir les instruc-
tions BASIC supplémentaires qui, avec celles que nous
connaissons déjà, forment véritablement les bases de la
programmation. Pour cela, nous allons programmer un jeu
qui nous permettra d'introduire de manière plus attrayan-
te de nouvelles instructions BASIC.
Au départ, notre jeu sera bien sûr un peu simple,
mais nous l'améliorerons progressivement. A quoi allons-
nous donc jouer ? Eh bien, nous allons essayer de pro-
grammer le jeu de la “roulette russe"... ou tout au mins
sa simulation.
Rappelons le principe de ce jeu (si dangereux dans la
réalité) : un revolver à six coups contient une seule
cartouche ; on fait tourner le barillet au hasard une
fois, puis chacun des joueurs à tour de rôle braque l'ar-
me contre sa tempe et appuie sur la détente, jusqu'à ce
que l'un d'eux renonce, auquel cas il a perdu, ou jusqu'à
ce que le coup parte...
Pour simuler le coup de feu, nous pourrons par exem-
ple faire écrire BANG. Pour repérer la balle dans le
barillet, nous pourrons utiliser une variable qu'on ap-
pellera par exemple BALLE, et qui vaudra un nombre de 1 à
6. On affichera alors BANG au premier coup si BALLE vaut
1 (c'est-à-dire si la balle est dans le premier logement
du barillet}), au deuxième coup si BALLE = 2, au troisième
si BALLE = 3, etc... Il nous faudra donc compter les
coups ; pour cela nous introduirons une variable COUP qui
vaudra 1 au premier coup et que nous augmenterons de 1 à
chaque coup.
Mais il faudra aussi que nous puissions tester si
BALLE = COUP ; il existe pour cela une instruction BASIC,
l'instruction IF, que nous allons détailler :
2.5.2 Instruction IF
Sa forme générale est la suivante :
IF condition THEN instruction l ELSE instruction 2
AY
Si la condition est vraie (IF signifie SI), on
exécute l'instruction 1 qui suit le THEN (THEN signi-
fie ALORS). Si la condition est fausse on effectuera
l'instruction 2 qui suit ELSE (ELSE veut dire SINON).
Puis on passe à la ligne suivante du programme.
Précisons que l'instruction ELSE n'est pas obliga-
toire ; on peut écrire simplement :
IF condition THEN instruction 1
Si la condition est fausse, on passe à la ligne sui-
vante, sans effectuer l'instruction 1.
Exemple
50 IF A = B THEN PRINT "A EGALE B" ELSE PRINT
"A EST DIFFERENT DE B"
La condition qui est testée ici est À = B. La machine
compare les valeurs de A et B ; si ces deux valeurs sont
égales, l'instruction qui suit THEN est effectuée : Oric
écrit A EGALE B. Sinon, il effectue l'instruction 2,
c'est-à-dire qu'il écrit A EST DIFFERENT DE B.
Lorsque l'instruction qui suit THEN est GOTO, la syn-
taxe est susceptible de se simplifier : on peut toujours
écrire :
70 IF À > B THEN GOTO 110
mais aussi simplifier par
70 IF A> B THEN 110
ou encore
70 IF A> B GOTO 110
On comprend aisément la signification de cet exemple.
Si la valeur de À est supérieure à la valeur de B, on va
à la ligne 110, sinon on passe à la ligne 80, suivante.
L'instruction IF est peut-être la plus importante des
Es
instructions BASIC ; aussi, avant de poursuivre, exami-—
nons en détail les types de condition qui peuvent suivre
le IF.
— Un premier type de condition est de la forme :
Expression Opérateur de Expression
arithmétique comparaison arithmétique
Exemples :
À = B
A > B
3 * A -2 > 4x B T2
Expression Opérateur de Expression
arithmétique comparaison arithmétique
Les opérateurs de comparaison sont les suivants
égal
supérieur
inférieur
différent
supérieur ou égal
inférieur ou égal
SNMRA NY
v
ll
— Un deuxième type de condition combine des condi-
tions du premier type à l'aide des trois opérateurs logi-
ques suivants
AND : et
OR : où
NOT : non
La syntaxe est la suivante (condition A et condition
B sont des conditions du premier type) :
condition A AND condition B
est vrai si, et seulement si, condition À et
condition B sont vraies toutes les deux.
= 45 —
condition À OR condition B
est vraie si l'une au moins des deux condi-
tions À ou B est vraie (elles peuvent aussi,
naturellement, être vraies toutes les deux).
NOT condition A
est vraie si condition À est fausse et
fausse si condition À est vraie.
Exemple
70 IF 2 * A> 4&+3TC OR B< 8 THEN 30
Cette instruction enverra à la ligne 30 si 2 * A est
strictement supérieur à 4+31C ou si B est strictement
plus petit que 8. Si aucune de ces deux conditions n'est
vérifiée, on passera à la ligne suivante.
Nous avons dit que IF est une des plus importantes
instruction BASIC. En effet, c'est elle qui permet à Oric
de prendre des décisions, c'est-à-dire d'exécuter une
instruction plutôt qu'une autre, en fonction des diffé-
rentes situations résultant des données ou des calculs.
Nous sommes donc, maintenant, en mesure de taper une
première version de notre jeu.
2.5.3 Première version du jeu
10 CLS
20 BALLE = 4
30 COUP = 1
4O PRINT "CLIC..."
50 IF COUP = BALLE THEN PRINT "BANG" ELSE
PRINT "SAUVE !"
60 INPUT "TAPEZ 1 POUR TIRER O POUR
ABANDONNER"; REP
70 IF REP = O THEN END
80 COUP = COUP + 1
90 GOTO 40
Nous découvrons à la ligne 10 une nouvelle instruc-
tion, l'instruction CLS. Elle a simplement pour but de
nettoyer l'écran de tout le texte qui peut s'y trouver et
46. =
de ramener le curseur en haut à gauche de l'écran. On
peut aussi la taper en mode direct, mais il est alors
plus simple de taper [CTRL] [L] qui a le même effet.
La suite du programme se comprend aisémnt ; au dé-
part COUP = 1 : c'est le premier coup ! On affiche
CLIC... pour suggérer que l'on commence à appuyer sur la
détente. Puis, grâce à l'instruction IF, on teste si la
balle est dans le logement du barillet face au canon,
c'est-à-dire pour nous si BALLE = COUP. Si c'est le cas
on imprime BANG : le coup est parti ; sinon on imprime
SAUVE !
On demande ensuite si l'on veut tirer à nouveau. Si
l'on tape 0 le jeu s'arrête, si l'on tape 1 (en fait tout
nombre autre que 0), le jeu continue : on va tirer une
nouvelle fois et donc passer au coup suivant. Pour cela
on augmente COUP de 1, à la ligne 80. Cette instruction
ne doit pas surprendre. En mathématique, bien sûr, elle
serait fausse, mais ici elle signale simplement que l'on
ajoute 1 à la variable COUP, puis que cette nouvelle va-
leur est affectée à la même variable COUP.
Ensuite, on repart à la ligne 40 où l'on recommence à
"tirer".
Une première objection vient tout de suite à l'es-
prit. À la ligne 20 il y a BALLE = 4. Nous savons donc où
se trouve la balle : dans le quatrième logement du ba-
rillet. Le jeu serait satisfaisant pour quelqu'un qui
n'aurait pas écrit le programme et qui ignorerait donc
combien vaut BALLE. Mais il est toujours possible de le
découvrir en listant le programme.
11 existe un moyen d'éviter cet inconvénient : faire
tirer un nombre au hasard par l'ordinateur lui-même.
2.5.4 Fonction RND
Cela est possible grâce à la fonction RND (abrévia-
tion du mot anglais RANDOM, qui signifie hasard).
Si nous tapons :
PRINT RND(1)
DAT
nous obtenons un nombre aléatoire compris entre 0 et 1.
Cela peut surprendre : comment un ordinateur dont le
comportement est parfaitement déterminé, peut-il donner
des nombres au hasard ?
En fait ces nombres ne sont pas vraiment tirés au ha-
sard. Ils sont calculés par des algorithmes précis, mais
qui, paradoxalement, donnent des suites de nombres, dits
pseudo-aléatoires, et qui sont tels que, statistiquement,
tout se passe comm s'ils avaient été tirés au hasard.
Un appel à RND est de la forme RND (X) avec X> O :
on obtient alors un nombre entre 0 et 1. Des appels suc-
cessifs avec la même valeur de X donnent les éléments
successifs d'une même suite pseudo-aléatoire (le nombre
obtenu changeant à chaque fois). En changeant la valeur
de X on change de suite, mais généralement on utilise RND
(1).
2.5.5 Fonction INT
Néanmoins notre problème n'est pas encore résolu, car
nous voulons un nombre entier entre 1 et 6. Pour cela,
nous allons utiliser la fonction INT qui donne la valeur
entière immédiatement inférieure.
Ainsi :
PRINT INT (3.1416)
donne 3
PRINT INT (127.4387)
donne 127
Attention : pour les nombres négatifs, on obtient
INT (-3.1416) = -4
INT (-127.4387) = -128
Comme nous voulons un nombre entier de 1 à 6, nous
taperons
s. 48. =
20 BALLE = INT (6 * RND(1)) + 1
RND(1) est compris entre 0 et 1, O et 1 exclus, donc
6 * RND(1) est compris entre 0 et 6, O et 6 exclus, d'où
INT (6 * RND(1)) est compris entre 0 et 5, O0 et 5 inclus.
En ajoutant 1, on a bien un nombre entier de 1 à 6.
Notre programme n'est pas encore parfaitement satis-
faisant, car une fois que le coup est parti, c'est-à-dire
qu'on a imprimé BANG, il demande encore si l'on veut ti-
rer, alors que, normalement, le jeu est terminé.
Pour éviter cet inconvénient nous pourrions, bien
sûr, mettre à la place de PRINT "BANG" un GOTO vers une
instruction faisant imprimer BANG, suivie de l'instruc-
tion END. Mais il existe une meilleure façon de faire
l'utilisation de l'instruction REPEAT ... UNTIL.
2.5.6 REPEAT ... UNTIL
Cette instruction s'emploie de la façon suivante :
REPEAT
instructions
UNTIL condition
REPEAT signifie “répéter”, UNTIL signifie
“jusqu'à ce que". Toutes les lignes d'instructions com-
prises entre REPEAT et UNTIL sont répétées, c'est-à-dire
réexécutées jusqu'à ce que la condition suivant UNTIL
soit vraie. Cette condition est du même type que celles
qui peuvent suivre un IF que nous avons déjà vu.
Cette structure pourrait être remplacée par IF NOT
condition GOTO x à la place de UNTIL, x étant le numéro
de la première ligne des instructions à répéter, mais le
programme serait beaucoup moins clair à lire et à com-
prendre. Aussi l'instruction REPEAT ... UNTIL est-elle à
utiliser partout où c'est possible.
— 49 —
2.5.7 Seconde version du jeu
Nous allons donc pouvoir modifier notre programme de
la façon suivante :
10 CLS
20 BALLE = INT (6 * RND(1)) + 1
30 REPEAT
4&O WAIT 100
50 INPUT "TAPEZ 1 POUR TIRER O POUR
ABANDONNER"; REP
60 IF REP = O THEN END
70 PRINT "CLIC..."
80 WAIT 200
85 COUP = COUP + 1
90 IF BALLE <> COUP THEN PRINT "SAUVE !"
100 UNTIL BALLE = COUP
110 PRINT "BANG"
120 EXPLODE
130 END
Nous avons aussi ajouté deux instructions nouvelles,
l'instruction WAIT et l'instruction EXPLODE.
2.5.8 L'instruction WAIT
En anglais, WAIT signifie ATTENDRE ; WAIT 100 au-
ra pour effet d'arrêter l'exécution pendant 100 fois 10
millisecondes, soit 1 seconde, WAIT 200 pendant 200 fois
10 millisecondes, soit 2 secondes... ; de manière généra-
le, une ligne d'instruction WAIT N provoquera un arrêt de
l'exécution de N fois 10 millisecondes.
Nous avons ajouté cette instruction pour laisser un
intervalle de temps entre 2 impressions sur l'écran, et
aussi pour ajouter au suspense, par l'attente du BANG ou
du SAUVE ! après le CLIC... !
2.5.9 L'instruction EXPLODE
Cette instruction provoque un bruit d'explosion, qui
donne beaucoup plus d'effet au jeu. Vous pouvez essayer
de la taper en mode direct.
Il existe d'autres instructions provoquant des bruits
- 50 -—
divers, tels SHOOT, ZAP, PING ; ces instructions sont
vues plus en détail dans le chapitre réservé aux possibi-
lités sonores d'Oric.
Avant de conclure, nous allons présenter une instruc-
tion assez semblable à REPEAT ... UNTIL, et elle aussi
très fondamentale : la boucle FOR ... NEXT.
2.5.10 Boucle FOR ... NEXT
REPEAT ... UNTIL nous permet de répéter une action
jusqu'à ce qu'une condition soit vérifiée, mais, a prio-
ri, nous ne savons pas combien de fois les instructions
seront répétées.
Aussi, pour pouvoir répéter une suite d'instruction N
fois, il existe l'instruction FOR ... NEXT, qui s'emploie
de la façon suivante
FOR I = 1 TO N
instructions
NEXT I
Son fonctionnement est le suivant : au départ I = 1,
et les instructions sont exécutées. On arrive à l'ins-
truction NEXT I (qui signifie I suivant), où l'on doit
tester si I est égal ou non à N. Si IL est plus petit que
N, I est augmenté de 1 et l'on réexécute les instruc-
tions, puis l'on compare à nouveau I et N.
Les instructions sont ainsi répétées jusqu'à ce que I
= N, auquel cas on passe à la ligne suivant le NEXT.
Cette instruction FOR ... NEXT sera revue et complé-
tée dans le chapitre suivant, aussi contentons-nous de
donner ici un exemple simple : faire imprimer les nombres
de 1 à 1000.
10 FOR I = 1 TO 1000
20 PRINT I
30 NEXT I
- 51 -
REMARQUE : Le nom de la variable, qui ici est I,
peut bien sûr être différent.
2.6 CONCLUSION
Nous avons pu, dans ce chapitre, découvrir un premier
jeu sur Oric, jeu assez simple, mais qui nous laisse en-
trevoir que les possibilités n'ont de limites que celles
de notre imagination.
Parvenus à la fin de ce livre, vous serez capables
d'écrire vous-même vos programmes de jeux. Dans cette
perspective, le chapitre suivant va nous permettre d'ap-
profondir encore notre connaissance du BASIC, en récapi-
tulant les instructions que nous avons déjà vues et en
nous en présentant de nouvelles.
— 52
CHAPITRE 3
Le langage
Basic
de l'oric
3.1 GENERALITES
L'objet de ce chapitre est de développer et de pré-
ciser les notions dont vous avez eu un aperçu au chapitre
précédent.
Nous allons examiner successivement les instructions
constituant le langage évolué, compréhensible par votre
microordinateur, qui vous permettront de réaliser tous
vos programmes.
— LE SYSTEME DE CARACTERES EMPLOYE :
Le but d'un programme est, en général, de calculer
des “valeurs”. En fait, un ordinateur ne “connaît” ces
valeurs que sous forme de représentations. Celles-ci
sont, comme nous l'avons vu au chapitre précédent, des
configurations physiques constituées de bits, d'octets,
de "paquets" d'octets.
Pour représenter les caractères qu'il comprend, votre
Oric utilise le code de représentation ASCII (initiales
d'American Standard Code of Information Interchange).
_- 53 —
Vous trouverez la liste des caractères et leur code ASCII
correspondant dans l'annexe F.
Vous pouvez noter que votre ordinateur utilise 1 oc-
tet (8 bits) pour représenter chaque caractère. Le mode
de représentation est globalement le suivant :
les valeurs
0 à 31 caractérisent les caractères de con-
trôle (CTRL T ... CTRL N etc...)
32 à 127 caractérisent les caractères alphanumé-
riques et les caractères spéciaux du
code ASCII.
128 à 255 caractérisent les mots constituant le
vocabulaire BASIC compréhensible par
votre Oric.
— LES CARACTERES ALPHANUMERIQUES SONT :
. caractères alphabétiques :
A, B, ..., Z (alphabet majuscule)
D] #
. caractères numériques :
0, 1, ..., 9
— LES CARACTERES SPECIAUX SONT :
PR TC) EST blanc SL OH La, D 0) 4e, 2
(alphabet minuscule) etc...
3.2 CONSTANTES -— VARIABLES - INDICES
3.2.1 Les constantes
Votre microordinateur distingue deux grands types de
constantes : les constantes numériques et les constantes
alphanumériques (ou chaînes de caractères).
— LES CONSTANTES NUMERIQUES
Celles-ci sont des nombres décimaux, de signe quel-
conque, qui peuvent s'écrire de trois façons distinctes :
_- 54 —
. une série de chiffres sans point décimal (nombre
entier).
exemple : PRINT 7653
. une série de chiffres avec point décimal (nombre réel
dit en virgule fixe).
exemple : PRINT 76.535
. un entier ou un réel en virgule fixe suivi de la lettre
E, d'un signe - éventuellement - et d'un entier (nombre
réel dit en virgule flottante).
exemple : PRINT 76.535 E+23
Le symbole E s'énonce “dix puissance, et signifie ci-
dessus que 76.535 est multiplié par 10 3 soit
10:50
23 zeros
Toutes ces constantes sont considérées par votre Oric
comme des nombres réels. La représentation de ces réels
s'effectue dans la machine à l'aide de 5 octets.
1 octet est utilisé par l'exposant
(dans l'exemple précédent +24)
& octets sont utilisés pour la mantisse
(dans l'exemple précédent 7.653500)
Vous trouverez des renseignements complémentaires sur
la représentation interne des réels en annexe E.
Ce type de représentation, ,vous imposera de, limiter
vos réels entre -1.70141 10 bo 1.70141 10 ; 16
réels compris entre -2.93874 10 et +2.93274 10
sont assimilés à O.
3811 est à noter qu'une constante -gupérieure à 1.70141
10 ou inférieure à -1.70141 10 provoque l'appa-
rition du message d'erreur ? OVERFLOW ERROR (dépassement
de capacité de la machine). De même l'écriture d'une
constante dont la mantisse possède plus de 38 chiffres
entraîne l'affichage du même message d'erreur.
- 55 —
Considérons maintenant
PRINT 11.123456789012345 [RETURN]
11.123456789
Observez qu'Oric n'édite que 9 chiffres après le
point décimal, ceci s'appelle une troncature.
En outre, compte tenu de la représentation interne
des réels, la machine a une précision de l'ordre de 9
chiffres sur la mantisse.
Pour nous convaincre, réalisons le programme suivant.
5 INPUT"A";A
10 INPUT"B";E
15 C=(A=B)
20 PRINT"'A=";A,"B=";B
25 IF C=0 THEN PRINT “ORIC CONSIDERE
QUE";A; "EST DIFFERENT DE";B
30 IF C=-1 THEN PRINT “ORIC CONSIDERE
QUE";A; "EST EGAL A'";B
35 END
Vous pouvez prendre, par exemple, dans un premier
temps
A=1.123456789 et B=1.123456790
puis A=1.1234567890 et B=1.1234567891
Il est important que vous gardiez en mémoire que la
précision de calcul de votre Oric est de 9 chiffres après
la virgule sur la mantisse.
La conclusion que l'on peut tirer de cet exemple est
que si la machine accepte des mantisses de 38 chiffres,
seuls les dix premiers sont significatifs. Donc, lors de
l'entrée des données, il est inutile de taper des mantis-
ses de plus de 9 chiffres.
Oric admet aussi une écriture des constantes
entières en numération en base 16 (numération hexadé-
cimale).
exemple : #10, # -E100
— 56 -
C'est le symbole # qui indique à la machine que
les caractères qui suivent figurent un nombre hexa-
décimal. (Ce nombre doit évidemment être écrit à
l'aide de chiffres hexadécimaux).
Ainsi : 5 A =Ë#G
10 PRINT A
RUN
provoque l'affichage du message d'erreur ? SYNTAX
ERROR IN 5 (G n'est pas un chiffre hexadécimal).
Vous trouverez des renseignements complémentaires
sur la numération hexadécimale en annexe E.
Si vous tapez par exemple, PRINT # 1EFA [RETURN],
vous noterez qu'Oric écrira directement ce nombre en
base décimale. La conversion inverse, c'est-à-dire
l'expression en base hexadécimale d'un nombre déci-
mal, s'effectue à l'aide de la fonction HEXS.
Exemple : PRINT HEXS$(16)
Notez que la conversion de la base 16 à la base
10 est limitée à des entiers variant entre - HFFFF et
+ AFFFF (-65535 et +65535).
Ainsi PRINT # 10000 provoque l'affichage du mes-
sage OVERFLOW ERROR.
— LES CONSTANTES ALPHANUMERIQUES
Celles-ci sont constituées d'une suite de n caractè-
res du code ASCII, situés entre cotes “doubles”.
Exemple : PRINT “je m'appelle Oric”
Notez que la double cote servant à délimiter une
chaîne de caractères ne peut pas être un caractère appar-
tenant à cette chaîne.
Si la chaîne de caractères est la dernière donnée
écrite sur une ligne, en mode direct ou différé, la dou-
ble cote “ finale peut être oubliée sans inconvénient,
puisque l'action sur la touche [RETURN] s'y substitue.
Toutefois l'emploi de cette solution pour écrire une
chaîne de caractères n'est pas à conseiller.
— 57 -
La longueur minimale d'une constante alphanumérique
est zéro (chaîne vide) ; sa longueur maximale est de 255
caractères.
La représentation interne d'une chaîne s'effectue par
le codage de chaque caractère, un à un, par le code ASCII
donc elle nécessite un octet par caractère de chaîne.
3.2.2 Les variables simples
Une variable est une entité mathématique à laquelle
on peut affecter diverses valeurs "variables". Pour défi-
nir une variable, il suffit de lui donner un nom.
Ce nom doit entrer dans une syntaxe bien précise à
laquelle vous devez vous conformer strictement.
. Le nom de la variable doit commencer par un carac-
tère alphabétique (A, B, ..., Z) et peut être suivi par
des caractères alphanumériques (A, ..., Z, 0, ..., 9).
Les caractères $ et % peuvent aussi être utilisés, mais
ils ont un rôle précis : ils caractérisent le type de la
variable (variable alphanumérique ou entière). Ces deux
caractères se placent toujours à la fin du nom de la
variable.
. Le nom d'une variable doit comprendre au maximum
238 caractères. En fait, l'interpréteur basic de votre
Oric représente chaque variable par les deux premiers
caractères de son nom, et par son type. Ainsi, les deux
variables POIRE et POIDS sont considérées comme identi-
ques pour la machine.
Toutefois, ce n'est pas une raison pour que vous
limitiez, dans vos programmes, les noms de vos variables
à 2 caractères. En effet, il est intéressant, pour amé-
liorer la lisibilité de vos programmes, de prendre comme
nom de variable le nom du résultat du calcul qu'on lui
affecte, ou bien le nom de ce que la variable représente.
Expliquons ceci plus clairement sur un exemple
simple.
Construisons un programme calculant l'aire d'un cer-
cle connaissant son rayon.
_- 58 —
5 REM CALCUL DE L'AIRE D'UN CERCLE
CONNAISSANT SON RAYON
10 INPUT "QUEL EST LE RAYON DU CERCLE"; RAYO
15 AIRE = PI * RAYO * RAYO
20 PRINT "L'AIRE DU CERCLE DE RAYON ” ; RAYO
3; "VAUT" ; AIRE
25 END
Ainsi la variable qui représente le rayon du cercle
s'appelle RAYO, et celle à laquelle on affecte le calcul
de la surface du cercle s'appelle AIRE.
Notez que PI est une constante stockée par Oric ;
cette constante vaut 3.14159265.
. En dernier lieu le nom d'une variable ne doit, en
aucun cas, contenir de mot appartenant au vocabulaire
basic de la machine (la liste de ces mots “réservés”
figure dans l'annexe A).
Ainsi, des noms de variable aussi anodins que PRUNE,
VALEUR, FORCE, LETTRE, NEUTRON, etc ne doivent pas être
employés.
L'emploi d'un mot réservé dans un nom de variable
provoque généralement l'apparition du message d'erreur
SYNTAX ERROR. Sinon l'interpréteur exécutera sans réac-
tion immédiate le mot réservé, ce qui aura des conséquen-
ces aussi imprévisibles que variées.
Vous pouvez utiliser trois types de variables dans
vos programmes : les variables alphanumériques, entières,
ou réelles.
— LES VARIABLES ALPHANUMERIQUES OÙ CHAINES DE
CARACTERES
Une variable est alphanumérique si le dernier carac-
tère de son nom est le symbole $. Le “contenu” d'une
telle variable doit obligatoirement être une constante
alphanumérique.
Exemple : AAS$= "A=l + BCDXY 56"
Si vous essayez AA$=1234567890, l'interpréteur basic
vous signalera l'erreur par le message TYPE MISMATCH
ERROR (les cotes sont fondamentales puisque ce sont elles
_- 59 -
qui indiquent que la constante est une chaîne de carac-
tères).
Il est à noter que la représentation interne de
cette variable AA$S s'effectue de la façon suivante :
Oric stocke dans cet ordre
. le nom de la variable (AA$), ce qui occupe 2
octets (les deux premiers caractères du nom sont
seuls concernés, le symbole $ est pris en compte dans
la manière de stocker la variable) ;
. la longueur de la chaîne de caractères, ce qui
occupe L octet (ceci vous explique pourquoi une chaî-
ne comprend au plus 255 caratères 255 = 2°-1) ;
+ l'adresse de la zone où est stockée la chaîne
de caractères, ce qui occupe 2 octets ;
. deux octets “"séparateurs".
Donc finalement, une variable alphanumérique
occupe 7 octets + le nombre d'octets correspondant au
nombre de caractères composant la chaîne. En conclu-
sion, vous devez retenir que l'emploi de variables
alphanumériques est coûteux en place mémoire.
— LES VARIABLES ENTIERES
Une variable est entière si le dernier caractère du
nom de celle-ci est le symbole %. Le “contenu” d'une
telle variable doit obligatoirement être une constante
non alphanumérique.
Exemple : 5 CA%=123
10 PRINT CAZ
RUN
Remarquez que CA% est un nombre entier (absence de
point décimal).
A présent, modifiez la ligne 5
5 CA%=1535.428
RUN
— 60 -—
Avec cet exemple vous pouvez voir que lorsque l'on
affecte à CA% une valeur réelle, la machine stocke en
fait le plus grand nombre entier inférieur à la valeur
réelle que vous avez affectée à CA%. (D'un point de vue
mathématique, Oric prend la partie entière de ce nombre
réel).
Afin d'améliorer la lisibilité de vos programmes
futurs, il est souhaitable que, dès à présent, vous
preniez l'habitude d'affecter à une variable entière une
constante mathématiquement de même type.
Ainsi, plutôt que de taper : CA%=13.22,
il est préférable d'utiliser : CA%=INT(13.22)
(la fonction INT est la fonction partie entière, ces deux
lignes sont donc équivalentes).
REMARQUE : CA%=#FAB est bien entendu licite puis-
que #FAB est un entier en numération hexadécimale.
Notez que PRINT CA% écrit CA% en numération décimale
(en base 10).
Si vous essayez CA%="123", l'interpréteur basic vous
signalera l'erreur par le message TYPE MISMATCH
ERROR, puisque la présence de ” “ signifie que vous
affectez à CA% une constante alphanumérique.
La représentation interne de la variable CA%
s'effectue de la façon suivante.
Oric stocke dans cet ordre :
. le nom de la variable (CA%) ce qui occupe 2
octets (les 2 premiers caractères du nom sont seuls
conservés, le symbole % est pris en compte dans la
façon de stocker la variable) ;
. la valeur affectée à la variable, ce qui occupe
2 octets.
Donc, le stockage d'une variable entière n'occupe
que 4 octets. Etant donné que la valeur de la varia-
ble est stockée sur 2 octets seulement, vous ne pour-
rez utiliser que les entiers compris entre -32768 et
+32767.
Vous trouverez des renseignements complémentaires
sur la représentation des entiers en annexe.
=ÉL'=
— LES VARIABLES REELLES
C'est l'option par défaut que prend la machine lors-
que le nom de la variable ne possède comme dernier carac-
tère ni $, ni %. Le contenu de cette variable doit être
une constante non alphanumérique.
Exemple : DA=1.23 E23
DA=3452.34.
La représentation interne de la variable réelle
DA s'effectue de la façon suivante
Oric stocke dans cette ordre
le nom de la variable, ce qui occupe 2 octets
(les 2 premiers caractères du nom sont seuls conser-
vés) ;
. la valeur affectée à la variable, ce qui, vous
l'avez vu au paragraphe précédent, nécessite 5 oc-
tets.
Le stockage d'une variable réelle n'occupe donc
que 7 octets.
Pour mémoire, les réels, que vous devez ypiliser sont
compris entre -1.70141 10 et 1./70141 10 . Bien en-
tendu, l'écriture d'une ligne du type CA="123" entraîne
l'affichage du message suivant : TYPE MISMATCH ERROR.
En conclusion, vous pouvez remarquer que suivant le
type de variable que vous considérez, telle ou telle
représentation physique sera adoptée par la machine.
C'est pourquoi les variables A, A$ et A%, de noms pour-
tant peu différents sont, en fait, fondamentalement
distinctes.
Il est donc capital de préciser à la machine, au mo-
ment de la programmation, le type de chaque variable que
vous voudrez utiliser. Cette gymnastique se révèlera
profitable à la longue, car elle vous conduira à définir
tous les “objets” que vous voudrez employer et, donc, à
mieux les contrôler.
A présent, étudiez le petit exercice suivant
— 62 —
Une personne de vos amis peut effectuer ses achats
dans 5 magasins différents. Mais elle veut connaître
celui qui est, en moyenne, le meilleur marché. Pour ce
faire, elle se constitue un panier de référence de 26
articles tests tous disponibles dans chaque magasin et
regarde le prix de chaque “panier de la ménagère".
En outre, inquiète de l'évolution des prix, elle veut
faire des essais tous les mois. Elle sait que vous possé-
dez un ordinateur et elle fait appel à vous pour élaborer
un programme permettant d'effectuer chaque mois les cal-
culs nécessaires à la réalisation de son enquête.
Soucieux d'utiliser les conseils prodigués précédem-
ment, vous définissez logiquement les variables qui vont
contenir les prix de chaque objet de chaque magasin. Vous
appelez les objets A, B, ..., Z (26 objets) et les
magasins 1, ..., 5 (5 magasins), les noms des variables
prix seront constitués du nom de l'objet auquel elles se
rapportent et du nom du magasin où a été acheté l'objet,
elles auront donc pour nom Al, Bl, ..., Zl, A2..., 22,
ses 25e
Les prix de chaque panier seront les variables AA,
BB, ..., EE (il faut se garder de donner le même nom à
deux variables différentes) ; par exemple le prix du
panier 3 sera CC = A3 + B3 + ... + 73.
Mais avant de faire ce calcul, il faut affecter à
chaque objet son prix dans chaque magasin (cette opé-
ration porte le nom générique de “saisie de données").
Votre programme débute par :
5 REM CALCUL DU MAGASIN LE MEILLEUR MARCHE
10 INPUT “PRIX DE L'ARTICLE 1 DU MAGASIN
l";Al
15 INPUT “PRIX DE L'ARTICLE 2 DU MAGASIN
1”;BL
Vous vous rendez compte à ce moment que vous allez
taper cette ligne pour chaque article de chaque magasin,
soit 130 fois, ce qui est extrêmement fastidieux. Or
chaque variable Al, Bl, ... Z5 a les mêmes propriétés.
En fait, votre Oric permet de résoudre et d'écrire
beaucoup plus élégamment ce genre de problèmes constitués
= 63 =
de travaux, comme ici, très répétitifs, c'est-à-dire la
construction de variables de mêmes caractéristiques et
leur emploi dans les calculs.
Dans le paragraphe suivant, nous allons justement
voir comment construire simplement un groupe de variables
de mêmes propriétés.
3.2.3 Les variables indicées ou tableaux
Votre ami étant une personne organisée, vous a en
fait remis le document suivant pour vous faciliter la
saisie des données.
Tableau des prix des articles dans chaque magasin.
(Tableau 1)
; article : À : B : sl : Z
: magasin : : : : : :
He de Mae Hs +4
O2 iMiBi Ji +2
cs iBiBi IH: 12:
A | Éd de he
D édite, dan di.
Votre Oric est pratiquemment capable de construire
et d'utiliser un tel document. D'un point de vue informa-
tique ce document s'appelle un tableau, et les éléments
de ce tableau s'appellent des variables indicées.
Voyons comment construire ce tableau.
Pour que Oric puisse connaître le tableau précédent,
il suffit de lui donner un nom et de définir la structure
et la taille de ce tableau. Ceci peut se réaliser par le
mot DIM de la façon suivante :
5 DIM PRIX(4,25)
— 64 -
Explication : PRIX est le nom que nous avons décidé de
donner au tableau contenant le prix de chaque article de
chaque magasin.
Les règles de formation des noms de tableaux sont stric-
tement les mêmes que celles concernant la formation des
noms de variables “simples” vues au paragraphe précédent
et que nous pouvons rappeler brièvement :
- le premier caractère du nom du tableau doit être
exclusivement alphabétique (A, ..., Z majuscule).
- les autres caractères du nom sont alphanumériques :
(A, ..., Z, Q;, ce. 9).
- les noms de tableaux doivent comporter au plus 238
caractères, mais en fait Oric n'utilise que les
deux premiers pour caractériser le nom.
— le nom du tableau ne doit pas contenir de mots
“réservés” du vocabulaire basic de la machine.
Voyons à présent pourquoi le nom PRIX est suivi par
deux nombres entre parenthèses. Le document remis par
votre ami est un tableau qui comporte des lignes et des
colonnes, c'est ce que l'on appelle un tableau à deux
dimensions :
. une dimension “horizontale” puisqu'il y a des lignes.
. une dimension “verticale” puisqu'il y a des colonnes.
Physiquement cette notion de dimension se traduit par
le nombre minimal d'informations qu'il faut fournir pour
retrouver un élément du tableau. Par exemble, l'élément
J3 du tableau est à l'intersection de la troisième ligne
et de la dixième colonne, donc 2 renseignements.
Le nombre de dimensions d'un tableau est ce que nous
avons appelé structure du tableau.
Les parenthèses qui suivent le mot PRIX sont en fait
les deux caractères qui indiquent à votre Oric qu'il est
en présence d'un élément de tableau. Et il y a autant de
nombres dans les parenthèses qu'il y a de dimensions dans
le tableau.
s/65=
Votre Oric vous permet de construire des tableaux
possédant entre une seule et 88 dimensions. La seule
limitation est en fait due à la taille de la mémoire de
votre ordinateur.
Ceci nous amène tout naturellement à parler de la
taille des tableaux et de la façon de repérer un élément
dans son tableau.
Lorsque nous avons écrit DIM PRIX(4,25), Oric a
réservé la place nécessaire pour stocker le tableau PRIX,
et pour lui le tableau a la structure suivante :
article SON sur, Fe ÿ 95 5725:
: magasin : : : : ; ; :
SU ire de de à
NN MES
Fe liée au. di, à
Les éléments de la ligne “article” qui se substituent
aux lettres A, ..., Z du tableau I sont appelés indices
de colonne.
Les éléments de la colonne “magasin” qui se substi-
tuent aux numéros des magasins du tableau sont appelés
indices de ligne.
Chaque indice de colonne repère une colonne différen-
te et chaque indice de ligne une ligne différente.
Pour repérer la “case” dans ce tableau PRIX où est
rangé J3, il suffit de donner le nom du tableau, puis le
numéro de la ligne où se trouve J3 , c'est-à-dire l'indi-
ce de ligne, ici 2,et le numéro de la ligne où se trouve
J3 , c'est-à-dire l'indice de colonne, ici 9.
Donc la case du tableau PRIX contenant J3 est la va-
riable indicée PRIX(2,9).
_ 66 -
Notez, et ceci est fondamental, que votre Oric fait
commencer les indices à 0.
En fait, lors de l'écriture DIM PRIX(4,25), on donne
à Oric la variable indicée, c'est-à-dire l'élément du
tableau PRIX, qui possède les numéros d'indices les plus
grands.
Ceci nous amène à dire que votre microordinateur ne
connaît finalement le tableau PRIX que par l'intermédiai-
re de ses éléments, les variables indicées.
À la limite, une variable indicée peut être interprê-
tée comme une variable “simple” ou “élémentaire”, et de
la même façon qu'il admet des variables entières, alpha-
numériques ou réelles, Oric admet des tableaux de varia-
bles indicées entières, alphanumériques, ou réelles.
— TABLEAUX DE VARIABLES ENTIERES
Oric reconnaît que toutes les variables indicées d'un
même tableau sont entières lorsque le dernier caractère
du nom du tableau est le symbole %.
Exemple : 5 DIM A%(50)
Toutes les variables indicées de A%(0) à A%(50) doi-
vent être entières et comprises entre -32768 et +32767.
Si vous écrivez :
10 A%(0)=1.255
15 PRINT A%(0)
vous constaterez qu'Oric écrira 1, c'est-à-dire qu'il
donne le plus grand entier inférieur à 1.255 (comme pour
les variables entières, il prend la partie entière).
Bien que la machine accepte l'écriture précédente, il
est préférable de toujours affecter à une variable indi-
cée entière, un entier ; ceci peut être réalisé à l'aide
de la fonction INT (partie entière) éventuellement.
Pour stocker dans ses mémoires un tableau
d'entiers, Oric utilise :
. deux octets contenant les 2 premiers caractères
du nom du tableau ;
67 =
. deux octets contenant l'adresse du tableau
suivant ;
. un octet contenant le nombre de dimensions du
tableau ;
. deux octets par dimension contenant la valeur
du plus grand indice dans la dimension ;
. deux octets par variables indicées entières.
Voyons ceci sur un exemple.
Le tableau B%(10,10,10,10) nécessite
pour stocker ses caractéristiques
2:+ 24 1 +2.x 4 = 13: octets
(4 dimensions)
pour stocker la valeur de chaque élément.
(11 x 11 x 11 x 11) x 2 = 29282 octets
nombre d'éléments dans le tableau
Notez en comparaison que votre Oric dispose au
maximum de 49.152 octets de RAM en code machine, et
de 39.421 pour l'usage de la RAM en BASIC.
— TABLEAUX DE CHAINES DE CARACTERES
Oric reconnaît que toutes les variables indicées d'un
même tableau sont alphanumériques lorsque le dernier
caractère du nom du tableau est le symbole $.
Exemple : 5 DIM B1$(50,50)
Toutes les variables indicées de B1$(0,0) à
B1$(50,50) doivent contenir des chaînes de caractères.
Si vous tapez 10 B1$(25,10)=23.4 l'interpréteur basic
vous signalera l'erreur par le message TYPE MISMATCH
ERROR.
Pour stocker dans ses mémoires un tableau de
chaînes de caractères, Oric utilisera :
— 68 -—
. deux octets contenant les 2 premiers caractères
du nom du tableau ;
. deux octets contenant l'adresse du tableau
suivant ;
. un octet contenant le nombre de dimensions du
tableau ;
. deux octets par dimension contenant la valeur
du plus grand indice dans la dimension ;
. trois octets contenant les paramètres d'iden-
tification de chaque variable indicée (adresse en
zone mémoire et longueur de la chaîne de caractères
affectée à la variable).
Si chaque élément du tableau B1$ contient une
chaîne de 10 caractères, votre microordinateur a be-
soin de 2+2+1+2x2+3x(51x51)=7812 octets pour stocker
les caractéristiques du tableau BIS.
11 ne faut pas oublier que pour chaque chaîne de
caractères, Oric utilise, pour la stocker, un nombre
d'octets égal au nombre de caractères de cette chaî-
ne, donc il a besoin de 51x51x10=26010 octets pour
stocker chaque chaîne de caractères affectée au ta-
bleau B1l$.
Donc Oric utilise 33822 octets pour stocker BIS.
Vous devez retenir de cet exemple que l'emploi de
tableaux de variables alphanumériques peut nécessiter
une place mémoire très importante même si ceux-ci ne
comportent qu'un petit nombre de variables.
— TABLEAUX DE VARIABLES REELLES
C'est l'option par défaut que la machine prend lors-
que le nom du tableau ne possède pas comme dernier carac-
tère $ ou 4.
Exemple : 5 DIM BA(100,50)
Toutes les variables indicées de BA(0,0) à BA(100,5Q}
devront être ,géelles et comprises entre -1.70141 10
et 1.70141 107 .
— 69 -
Pour stocker dans ses mémoires un tableau de
réels, Oric utilise :
. deux octets contenant les 2 premiers caractères
du nom du tableau ;
. deux octets contenant l'adresse du tableau
suivant ;
. un octet contenant le nombre de dimensions du
tableau ;
. deux octets par dimension contenant la valeur
du plus grand indice dans la dimension ;
. cinq octets par variable indicée réelle.
Donc le tableau BA(100,50) nécessite
- pour stocker ses caractéristique 2+2+1+2x2=9 octets
— pour stocker la valeur de chaque variable réelle
101x51x5=25755 octets.
Soit en tout 25764 octets.
A noter en comparaison que le tableau BA%(100,50)
de mêmes dimensions utilise 10311 octets. Ceci de-
vrait achever de vous convaincre de la nécessité
qu'il y a de préciser exactement à la machine le type
des variables et des tableaux de variables que vous
voulez utiliser.
Avant de passer au paragraphe suivant qui va vous
rappeler l'utilisation des opérations arithmétiques
vues au chapitre précédent, il reste un dernier point
«
à préciser à propos des variables indicées.
Les indices doivent être entiers et strictement
positifs ou nuls.
En utilisant les notions vues au chapitre précé-
dent et les notions sur les variables indicées, vous
êtes en mesure de réaliser le programme “calcul du
magasin le meilleur marché".
Essayez !
«0e
3.3 LES OPERATEURS
Un opérateur est un outil qui permet d'éxécuter des
opérations mathématiques ou logiques. Oric distingue
trois types d'opérateurs, ainsi que vous l'avez vu, les
opérateurs arithmétiques, relationnels et logiques (ou
booléens).
3.3.1 Les opérateurs arithmétiques
. l'opérateur d'addition noté +
. l'opérateur de multiplication noté *
l'opérateur de soustraction noté -
l'opérateur de division noté /
. l'opérateur d'élévation à la puissance noté T
Nous vous rappelons que "A élevé à la puissance B",
qui s'écrit ATB signifie que l'on multiplie A par lui-
même B fois.
Ainsi écrivons
? 513 [RETURN]
125
B n'est pas nécessairement entier mais A est néces-
sairement un nombre réel strictement positif.
Si vous tapez
5 A=-2
10 PRINT AT1.2
RUN
Le basic vous signalera l'erreur par le message ILLEGAL
QUANTITY ERROR IN 10.
Bien entendu, les opérateurs arithmétiques n'agissent
que sur des nombres entiers ou réels, le résultat étant
un nombre qu'Oric considère comme réel.
= 7U.=
3.3.2 Les opérateurs relationnels
. l'opérateur de stricte supériorité noté >
(A>B À strictement supérieur à B)
. l'opérateur de stricte infériorité noté «
(A<B A strictement inférieur à B)
. l'opérateur d'égalité noté =
(A=B À est égal à B)
. l'opérateur de supériorité noté >=
(A >B À supérieur ou égal à B) ou = ?
. l'opérateur d'infériorité noté « =
(A£B À inférieur ou égal à B) ou = €
. l'opérateur de non égalité noté > «
(A ZB A différent de B) ou <>
Vous pouvez remarquer à cet égard la différence fon-
damentale de nature entre le signe = opérateur d'égalité
et le signe = qui signifie que l'on affecte à une varia-
ble le résultat d'une opération arithmétique. Le basic de
votre Oric possède une instruction qui permet de ‘“mar-
quer” cette différence : c'est l'ordre LET.
Exemple : LET A=1.5+5%4.23
L'ordre LET assigne à A le résultat de l'opération
1.5+5%4.23. Il est facultatif, aussi LET A=5 et A=5
signifient la même chose. Cette signification du signe =
vous permet de comprendre pourquoi l'expression
5 A=A+l
est licite, et ce qu'elle signifie ; à la variable A on
affecte le résultat du calcul de l'addition A+.
Rappelons que l'instruction
10 C=A=B
signifie qu'à la variable C on affecte le résultat du
"test" A=B.
= Por
Dans un test réalisé avec n'importe lequel des opérateurs
relationnels,
ce test est positive C vaut -1,
ce test est négative à C est affectée la
si la réponse
si la réponse
valeur 0.
à
:
à
Donc le résultat d'un test (c'est ainsi que nous
appellerons désormais une expression relationnelle) est
un entier qui vaut O0 ou -1.
REMARQUE : Pour améliorer la lisibilité de la
ligne 10 précédente, c'est-à-dire au niveau de
l'écriture, bien différencier les deux rôles du signe
=, vous pouvez adjoindre des parenthèses.
10 C=(A=B)
Le rôle des parenthèses utilisées dans des expres-
sions arithmétiques ou logiques sera reprécisé plus loin.
3.3.3 Les opérateurs logiques
. l'opérateur AND qui signifie ET
. l'opérateur OR qui signifie OU
. l'opérateur NOT qui prend la négation.
Les opérateurs logiques, aussi appelés booléens,
agissent sur des tests (ou expressions logiques ou rela-
tionnelles).
— ACTION DE AND
AND s'utilise ainsi : A AND B, avec A et B expres-
sions relationnelles ; l'expression globale A AND B
constitue elle aussi un test. Le résultat du test À AND B
est positif si la réponse à chacun des deux tests A et B
est positive.
— ACTION DE OR
OR s'utilise ainsi : A OR B, avec À et B tests ;
l'expression globale A OR B constitue elle aussi un test.
=-73
Le résultat du test A OR B est positif si l'une au moins
des réponses, à l'un des deux tests À ou B, est positive.
— ACTION DE NOT
NOT s'utilise ainsi : NOT A, avec À test. L'expres-
sion globale NOT A constitue elle aussi une expression
logique. Le résultat du test NOT A est l'opposé du résul-
tat du test A.
Ainsi, si la réponse au test A est "vrai", alors la
réponse au test NOT À est "faux" et réciproquement.
3.3.4 Règles d'évaluation des expressions arithmétiques
et logiques
L'expression 2+3*4 peut s'interpréter de deux façons,
soit (2+3)x4=20, soit 2+(3x4)=14.
Pour lever cette ambiguïté Oric utilise des règles
d'évaluation, c'est-à-dire que certaines opérations
seront exécutées avant d'autres : cela signifie qu'il y a
une hiérarchie naturelle des opérateurs.
L'ordre de priorité décroissant des opérateurs est le
suivant
T, NOT, * /, + —-, tous les opérateurs relationnels, AND,
OR.
Exemple : PRINT 273+2%3 [RETURN]
14
Oric a effectué cette opération de la façon suivante:
Calcul de 273(=8) puis de 2*3 (-=6) puis finalement de
(273}+(2%3)=-14.
Mais si vous, vous vouliez qu'Oric calcule
(27(3+2))*3, il suffit d'afficher cette opération sur
l'écran de télévision comme elle est écrite sur cette
feuille. Ce sont les parenthèses qui permettent de modi-
fier à volonté l'ordre des opérateurs.
Lorsque vous utiliserez des parenthèses dans les
opérations arithmétiques ou logiques, les opérations
situées à l'intérieur des parenthèses seront effectuées
avant celles qui sont à l'extérieur des parenthèses.
= 74 =
Si vous avez plusieurs niveaux de parenthèse (parenthèses
imbriquées) ce sont les opérations situées dans les
parenthèses les plus “intérieures” qui seront effectuées
les premières, et ainsi de suite. Vérifiez toujours que
vous avez autant de parenthèses ouvrantes “(" que de
parenthèses fermantes ; Sinon votre Oric vous signa-
lera l'erreur par le message SYNTAX ERROR.
Sur l'exemple précédent (27(3+2))*3, il y a deux
niveaux de parenthèses :
(2 TT (3+2))*3
2ème niveau
ler niveau
Maintenant que nous avons défini les "objets" qui
seront manipulés dans vos programmes, il ne nous reste
plus qu'à voir les ordres basic qui vont constituer la
charpente de ceux-ci.
3.4 LES INSTRUCTIONS BASIC FACULTATIVES
Nous avons choisi d'appeler ainsi certaines instruc-
tions basic qui, si elles sont employées, ne sont pas
prises en compte, ou bien si elles sont absentes, amènent
la machine à prendre une option par défaut. Leur emploi
est tout de même fondamental puisqu'elles améliorent de
façon considérable la lisibilité du programme.
3.4.1 CLEAR
Cet ordre permet de remettre toutes les variables
numériques à zéro et les variables alphanumériques à la
chaîne “vide”. Cette instruction n'a pas d'utilité en
début de programme, puisque l'ordre RUN que vous utilisez
poour lancer le programme initialise automatiquement tou-
tes les variables à zéro ou au vide.
Avant d'utiliser cette instruction vérifiez que tou-
tes les valeurs calculées dans les instructions précédant
CLEAR ne vous sont plus d'aucune utilité après cet ordre.
(Ne pas mettre CLEAR dans les boucles FOR ... NEXT et
REPEAT ... UNTIL par exemple).
— 75 —
3.4.2 DIM
Cette instruction que nous avons déjà rencontrée
permet de dimensionner un tableau. Elle est facultative.
En effet si vous écrivez comme première instruction :
5 BEC(1,1,1) = 7
Oric considère que BEC est un tableau de réels et que la
variable indicée de BEC qui possède les indices les plus
grands est BEC(10,10,10).
BEC possède donc 11xllx11=1331 éléments.
Donc, si vous n'utilisez pas DIM, à la première
variable indicée qu'il trouvera, Oric allouera un tableau
dont la variable de plus haut niveau d'indice sera 10
dans chaque dimension.
Lorsqu'un tableau est dimensionné, il ne peut être
redimensionné dans la suite du programme.
Ainsi : 5 DIM A(30)
10 DIM A(35)
RUN
provoque l'affichage du message REDIM'D ARRAY ERROR. De
même
5 A(1)=0
10 DIM A(35)
provoque l'affichage du même message.
Ceci s'explique parce qu'Oric, rencontrant la varia-
ble indicée A(1) à la première ligne du programme, consi-
dère par défaut que À est un tableau de 11 éléments. La
ligne suivante est alors considérée comme une tentative
de redimensionnement du tableau A.
L'ordre DIM doit précéder toute instruction où un
élément du tableau dimensionné par DIM est utilisé, pour
être licite.
Vous devez vous souvenir que lorsque vous écrivez DIM
A(35), cela signifie que A(35) est l'élément du plus haut
indice du tableau A, et que le tableau A possède 36
éléments A(0), ..., A(35).
— 76 -
3.4.3 END
Cette instruction provoque l'arrêt du programme, mais
contrairement à l'ordre STOP que nous verrons ultérieure-
ment, n'indique pas le numéro de la ligne où s'est effec-
tué l'arrêt du programme.
Cette instruction n'est pas obligatoire, car l'exécu-
tion s'arrête lorsque la dernière instruction physique du
programme est rencontrée (sauf si cette instruction est
un ordre de transfert, ordre que nous verrons au paragra-—
phe suivant).
3.4.4 FRE
Cette instruction permet de connaître en mode direct
ou différé, le nombre d'octets encore disponibles dans la
mémoire de votre microordinateur.
Exemple : ? FRE (0)
En mode différé elle a un autre avantage qui peut être
très intéressant.
Considérons
5 A$="ABCDE"
10 A$="123456"
15 PRINT AS$
Pour exécuter ce programme, votre Oric stockera :
à la ligne 5 : A, B, C, D, E, l'adresse du premier
caractère À, la longueur de la chaîne
A$.
à la ligne 10 : As: BC; D:. EE, 1, 2% 3, 4,5; 6,
l'adresse du premier caractère de la
chaîne A$, c'est-à-dire 1 et la
longueur de la chaîne AS.
Cet exemple vous montre que lors du maniement de
chaînes de caractères Oric stocke toutes les chaînes in-
termédiaires de calculs, ce qui occupe beaucoup de place.
Justement l'ordre FRE permet de remédier à ce problème,
car il permet à votre Oric de libérer ses mémoires de ces
bouts de chaînes inutiles et encombrants.
71 =
11 s'utilise sous la forme
1030 A = FRE (" ‘“)
Il permet, lors du maniement de chaînes de caractè-
res, de “purger” le contenu des mémoires.
REMARQUE : Cet ordre est évidemment indispensable
lors du maniement de grandes chaînes de caractères ou
lorsqu'il y a beaucoup d'opérations effectuées sur
ces chaînes. Par contre cet ordre demande un certain
temps d'exécution.
3.4.5 LET
Cette instruction qui est facultative assigne une
valeur à une variable.
Exemple : 5 LET A=3
Bien entendu, la variable et la constante doivent
être de même type. (Si la variable est entière, la cons-
tante étant réelle, la valeur effective assignée à la
variable est l'entier immédiatement inférieur.
3.4.6 STOP
Cette instruction provoque l'arrêt de l'exécution du
programme.
Si vous tapez
10 A=10
15 STOP
20 PRINT A
RUN
Oric répond
BREAK IN 15
C'est-à-dire que, lors de l'utilisation du mot STOP, le
programme s'arrête là où cet ordre est interprêté et il y
a affichage du numéro de la ligne où se situe l'ordre qui
a provoqué l'arrêt du programme.
— 78 -
3.4.7 REM
Cette instruction a pour seul but de vous permettre
d'insérer des commentaires dans vos programmes.
Lorsque l'interpréteur basic rencontre cette instruc-
tion en début de ligne, celle-ci est considérée comme
inexistante. Ainsi, si vous mettez plusieurs instructions
basic sur la même ligne (ce qui est permis par le carac-
tère :) où REM est le premier ordre, ces instructions ne
seront pas prises en compte.
Exemple : 5 REM PROGRAMME D'ESSAI : A=1 : PRINT A
10 STOP
RUN
Sur l'écran vous voyez s'afficher :
BREAK IN 10
Cette instruction est fondamentale car il ne faut pas
oublier que la principale qualité d'un programme est,
outre sa justesse bien entendu, sa lisibilité. Celle-ci
permet aux utilisateurs et à l'auteur... de comprendre
pas à pas ce qu'effectue le programme lors de sa lecture.
Toutes les instructions que nous venons de voir sont
"facultatives". Elles ont un autre point commun dans la
mesure où l'interpréteur basic les prend en compte sui-
vant l'ordre croissant du numéro de la ligne dans laquel-
le elles se trouvent. Nous allons voir à présent des
instructions qui permettent de modifier l'ordre de dérou-
lement d'un programme, c'est ce que l'on appelle des
ordres de transfert.
3.5 LES INSTRUCTIONS DE TRANSFERT
Le basic de votre microordinateur distingue deux
types d'instruction de transfert.
3.5.1 Les ordres de transfert inconditionnels
— GOTO
Cet ordre indique, à l'interpréteur, d'aller exécuter
_- 79 -
4
les instructions à partir d'une ligne donnée du program-
me.
Exemple : 5 I=I+l
10 GOTO 5
15 END
RUN
Sur cet exemple vous pouvez voir que le nombre qui suit
l'ordre GOTO (5) est entier, c'est le numéro de la ligne
où l'on veut se brancher. Ce nombre est exprimé explici-
tement mais peut aussi être calculé comme dans l'exemple
suivant
5 I = 20
10 GOTO I
15 STOP
20 PRINT I
251 =1-35
28 GOTO I
L'entier qui suit GOTO doit effectivement correspon-
dre à un numéro de ligne existant dans le programme.
Eliminez les modifications précédentes et écrivez
10 GOTO 30
RUN
Il n'y a pas de ligne 30 dans le programme, le message
d'erreur UNDEF'D STATEMENT ERROR s'affiche sur l'écran.
Si vous revenez à l'exécution du programme initial,
vous vous rendez compte qu'effectivement le programme se
rebranche toujours à la ligne 5... et vous ne passez
jamais par la ligne 15. Autrement dit ce programme ne
peut pas s'arrêter de lui-même. Pour ‘reprendre la main”
vous êtes obligé de taper [CTRL] [C] ou d'appuyer sur
[RESET], touche située à l'opposé du clavier.
Cet exemple vous montre donc ce qu'est une boucle
sans fin.
C'est en fait la chose dont il faut se méfier avec
cette instruction GOTO. En général on remédie à ce pro-
blème en utilisant un ordre de transfert conditionnel
(voir plus loin).
— 80 -
Loa ON .…. GOTO
Cette instruction est, elle aussi, un ordre de trans-
fert inconditionnel, mais elle s'emploie un peu différem-
ment de GOTO.
Voyons ceci sur l'exemple suivant :
5 REM EXEMPLE D'UTILISATION DE L'£INSTRUCTION
ON ... GOTO
10 INPUT "I=";I
15 ON I GOTO 25, 30
20 STOP
25 PRINT "LORSQUE I=1 LE TRANSFERT S'EFFECTUE
SUR"
26 PRINT "LA PREMIERE ETIQUETTE DU GOTO"
27 GOTO 10
30 PRINT “LORSQUE I=2 LE TRANSFERT S'EFFECTUE
SUR"
31 PRINT "LA DEUXIEME ETIQUETTE DU GOTO"
35 GOTO 10
Pour I entrez successivement 1, 2, 3 et observez ce
qui se produit, puis relancez le programme et entrez O0,
255, 256, -1.
Vous voyez donc que lorsque vous tapez ON I GOTO 25,
30, I se rapporte à la position du numéro de ligne sur
laquelle on veut se brancher : I doit donc être un en-
tier. Si vous entrez un réel, Oric effectuera l'opération
qui vous est maintenant familière : il affecte à I le
plus grand entier inférieur à ce réel.
Lorsque vous avez entré 256 ou -1, la machine répond
ILLEGAL QUANTITY ERROR. Ceci vous prouve que I doit tou-
jours être positif, d'une part, et d'autre part que vous
n'avez droit qu'à 255 numéros de lignes derrière le GOTO.
Lorsque vous avez tapé O0 ou 3, vous vous êtes rendu
compte que la machine s'arrêtait à la ligne 30, c'est-à-
dire que si I est nul ou si I est plus grand que le nom-
bre d'étiquettes derrière le GOTO (I1£<255), l'instruction
ON ... GOTO est ignorée et l'interpréteur passe à la li-
gne suivante. Bien entendu, les numéros de lignes situés
derrière le GOTO sont entiers et explicités. Ils doivent
correspondre à des numéros de lignes existants.
- 81 -
3.5.2 Les ordres de test ou de comparaison
Ka IF . THEN . ELSE
Cet ordre que vous avez vu au chapitre précédent
appartient au deuxième type d'instruction de transfert :
c'est un ordre de transfert conditionnel.
Rappelons, sur l'exemple vu pour l'instruction GOTO,
le fonctionnement de IF ... THEN ... ELSE.
5 I=I+1
10 PRINT I
15 IF (I > 1000) THEN STOP ELSE GOTO 5
RUN
Lors de l'exécution vous voyez défiler sur l'écran
tous les nombres entiers de 1 à 1000 puis BREAK IN 15 ;
que s'est-il passé ?
La ligne 15 se traduit littéralement par :
Si I > 1000 alors l'exécution s'arrête, sinon le program-
me se branche à la ligne 5 et c'est ce que permet de fai-
re cette instruction.
Sa syntaxe est IF A THEN B ELSE C. À est un test (ex-
pression logique) B et C étant des instructions basic. Si
la réponse au test A est “vrai”, l'ordre B est exécuté
sinon c'est l'ordre C qui est exécuté.
L'ordre ELSE est facultatif. S'il est absent et que
le test À est faux le programme passe à la ligne suivan-
te. Si le test A est vrai, l'ordre B et exécuté comme
précédemment.
Si vous écrivez IF A THEN cette instruction de trans-
fert n'a aucune action.
Si ELSE est utilisé, B ne devra pas comporter d'opé-
rations arithmétiques, sinon il apparaîtra le message
SYNTAX ERROR IN lorsque B sera exécuté.
Le programme suivant vous montre un exemple simple
d'utilisation de l'instruction IF ... THEN ... ELSE.
— 82 —
10 REM SAISIE DE DONNEES
20 REM
30 INPUT "NOM DE L'ARTICLE";NS
40 INPUT "PRIX";PX
50 PRINT NS, PX
60 INPUT “VALIDEZ-VOUS CES DONNEES ‘"; AS
70 IF ((A$<>"O") AND (A$<>"N")) THEN 60
ELSE IF (A$="O") THEN PRINT "DONNEES
ENTREES" ELSE 30
80 END
Faites exécuter ce programme plusieurs fois en tapant
par exemple :
DRAP
puis 70.
puis N (non)
puis O (oui)
à la question VALIDEZ-VOUS CES DONNEES ?
REMARQUE : Il ne peut y avoir dans une instruc-
tion basic plus de deux tests IF consécutifs. Par
exemple, la ligne 70 du programme ci-dessus serait
refusée, si vous remplaciez l'instruction PRINT
"DONNEES ENREGISTREES" par l'instruction nouvelle IF
(PX=0) THEN 40.
Nous avons donc vu les instructions basic qui permet-
tent d'exécuter des instructions d'une ligne de program-
me, à partir d'une autre. Par ailleurs vous avez vu un
exemple de “boucle” que l'on peut effectuer à l'aide de
l'ordre IF ... THEN ... ELSE GOTO. En fait le basic de
votre Oric a des commandes qui sont spécifiques à ce
genre de cas ; ce sont ces instructions que nous allon
examiner maintenant. :
3.6 LES BOUCLES
Le basic de votre microordinateur possède deux ins-
tructions spécifiques et distinctes pour faire du calcul
répétitif qu'on appelle boucles
L'instruction FOR ... TO ... STEP ...
NEXT ...
et l'instruction REPEAT
UNTIL
— 83 -
Ces deux groupes d'ordres permettent de faire répéter
autant de fois que l'on veut les instructions situées
entre les deux lignes qui constituent la syntaxe des deux
groupes d'instruction.
3.6.1 FOR ... TO ... STEP ... NEXT ..e
Voyons l'utilisation de cette instruction sur un
exemple
5 REM CALCUL DU MAGASIN LE MEILLEUR MARCHE
10 DIM PRIX(4,25) : DIM PANIER(4)
15 REM ENTREE DES DONNEES ET CALCUL DU PRIX
DE CHAQUE PANIER
20 FOR I=0 TO 4 STEP l|
22 IPI1=I+l
25: FOR J=0 TO 25 STEP !
27: JP1=J+1
30: PRINT “QUEL EST LE PRIX DU PRODUIT
No";JP1; "DANS LE MAGASIN";IP1
33: INPUT PRIX(I,J)
35: PANTER(I)=PANIER(I)+PRIX(I,J)
40: NEXT J
45: NEXT I
50 REM RECHERCHE DU MAGASIN LE MEILLEUR
MARCHE
55 K=PANIER(O) : L=0
60 FOR I=1 TO 4
65 IF (K> PANIER(I)) THEN L=I
70 IF (K> PANIER(I)) THEN K=PANIER(I)
72 NEXT I
73 LP1=L+1
75 PRINT "LE MAGASIN No";LP1;"EST LE MEILLEUR
MARCHE CE MOIS-CI"
80 END
Examinons la syntaxe de cette instruction de boucle.
À la ligne 20, nous avons FOR I=0 TO 4 STEPI et en 45
NEXT I. Ceci signifie que toutes les instructions situées
entre les lignes 20 et 45 seront exécutées tant que le
réel I (qui est appelé indice de la boucle) sera infé-
rieur à 4. Ici O0 est la valeur initiale de I et 4 la
borne supérieure de I. l est le nombre qui est ajouté à I
chaque fois que l'instruction de la ligne 45 est exécutée
(on dit que l'on incrémente I de 1 lorsque NEXT I est
exécuté).
— 84 —
Le test de comparaison de I et de sa borne supérieure
n'est effectué qu'à l'instruction NEXT I, ce qui signifie
que, quelle que soit la valeur de I, les instructions qui
sont dans la boucle seront effectuées au moins une fois.
Dans la ligne 60 vous voyez que STEP n'a pas été
utilisé. En fait ce mot est facultatif ; lorsqu'il n'est
pas employé la machine prend par défaut un pas égal à 1.
En résumé la syntaxe de l'instruction s'écrit :
FOR I=A TO B STEP C
NEXT I
A, Bet C sont des nombres réels quelconques (ç peut
être négatif), ce sont les paramètres de la boucle. Lors-
que I est supérieur ou égal à B (si C est positif) ou I
inférieur ou égal à B (si C est négatif), la boucle est
"désactivée"; c'est l'instruction qui est après NEXT I
dans le programme qui est alors exécutée. Il est forte-
ment déconseillé de modifier les paramètres de la boucle
à l'intérieur de celle-ci.
Dans les lignes qui sont situées dans la boucle peut
figurer n'importe quel ordre basic. Vous pouvez utiliser
un ordre GOTO pour sortir d'une boucle. Mais ceci n'est
pas recommandé car le basic, n'ayant jamais exécuté le
test (I supérieur ou égal à B ou L inférieur ou égal à B)
avec une réponse positive, considère que la boucle est
toujours active bien que, physiquement, ce ne soit pas le
cas.
Vous pouvez, bien entendu, mettre une instruction FOR
+. TO ... STEP ... NEXT ... dans une boucle (voir ligne
25 à ligne 40 de l'exemple précédent) ; dans ces condi-
tions on dit que l'on est en présence de boucles imbri-
quées. La syntaxe des boucles imbriquées est :
10 FOR I=Al TO Bl STEP C1
100 FOR J=A2 TO B2 STEP C2 |
200 NEXT J
300 NEXT I
_- 85 -
Les indices des deux boucles doivent avoir un nom
différent, sinon la boucle extérieure est rendue inacti-
ve. Il n'y a aucun inconvénient à ce que deux boucles non
imbriquées aient le même indice (cf exemple précédent).
Il y a incrémentation sur l'indice extérieur à chaque
fois que la boucle intérieure est “désactivée”. On ne
peut pas imbriquer plus de 10 boucles les unes dans les
autres, sans obtenir le message NEXT WITHOUT FOR ERROR.
Si vous laissez plus de dix boucles “actives” parce que
vous “sortez” de celles-ci par l'ordre GOTO, le même
message s'affichera.
La syntaxe 10 FOR I=A1 TO B1l STEP C1
100 FOR J=A2 TO B2 STEP C2
200 NEXT I
300 NEXT J
où, vous le remarquez, deux boucles se "croisent", est
erronée. En présence de telles boucles, il y a affichage
du message d'erreur NEXT WITHOUT FOR ERROR.
Considérons le problème suivant : on se propose de
trouver des triplets de nombres 2 2 (As B, C) À, B, C
compris entre Ll et N tels que =ç? (côtés d'un
triangle rectangle). Une solution classique de ce problè-
me est le triplet (3, 4, 5). On peut écrire le programme
suivant :
5 REM RECHERCHE DES CARRES DE PYTHAGORE
JUSQU'A UN CERTAIN RANG
8 CLS
10 INPUT “VEUILLEZ ENTRER LA BORNE SUPERIEURE
N';N
15 FOR A=L TO N
17 AX=INT(A)
20: FOR B=1 TO N
23: BX=INT(B)
25: FOR C=1 TO N
27: CY=INT(C)
30: IF ((A%%A%+B%XB%-CXkC%)=0) THEN
PRINT A,B, C
35: NEXT C
40: NEXT B
45 NEXT A
50 END
— 86 -—
Vous remarquerez que l'exécution de ce programme est
longue, surtout lorsque N est grand. La question que l'on
peut se poser est : peut-on remédier à ce problème ?
Dans ce programme, on peut observer quelques points
“"litigieux".
Dans le test de la ligne 30 vous constatez que l'on
calcule dans la boucle la plus intérieure les produits
AX*A% et B%*B% à chaque incrémentation sur C. Or les deux
variables A% et B% sont indépendantes de C. Par consé-
quent dans la boucle
25 FOR C=1 TO N
35 NEXT C
AX%*A% et BX*B% sont des constantes ; il est inutile de
les recalculer dans cette boucle. Ces produits doivent
donc être évalués à l'extérieur de la boucle.
Il faut donc retenir pour vos programmes futurs que
lorsque vous utiliserez des boucles, il faut vérifier si
à l'intérieur de celles-ci vous n'effectuez pas des opé-
rations sur des variables indépendantes de l'indice de la
boucle.
Pour ce programme spécifique, il est encore possible
d'améliorer la vitesse d'exécution. En effet, il est
inutile de faire jouer à À et B le même rôle puisque, par
exemple, les triplets (3, 4, 5) et (4, 3, 5) sont en fait
igensiques. On décide que A sera inférieur à B, et
A +B =C montre que À et B sont strictement
inférieurs à C (d'ailleurs A est alors strictement
inférieur à B). Ceci permet de modifier les paramètres
des diverses boucles, afin de diminuer le nombre
d'itérations.
Ainsi : C variera de L à N
B variera de L à C-1
À variera de INT (SQR(2*C-1)) à B-1
Il faut en fait retenir de cette dernière série de
modifications que lorsque l'on utilise des boucles, jil
faut, en fonction du problèm que l'on veut résoudre,
choisir avec une très grande minutie les valeurs des
bornes des boucles.
ST
Le programme modifié s'écrit :
REM RECHERCHE DES CARRES DE PYTHAGORE
JUSQU'A UN CERTAIN RANG
CLS
INPUT "VEUILLEZ ENTRER LA BORNE SUPERIEURE
N" 3; N
FOR C=1 TO N
CX=INT(C)
C14=CX*CZ
N1=C-1
N2=INT (SQR(2*C-1))
FOR B=1 TO N1
BX=INT(B)
RX=C17-BX*BX
N3=B-1
FOR A=N2 TO N3
AY=INT(A)
IF(R%-A%%*A%=0) THEN PRINT À, B, C
NEXT A
NEXT B
NEXT C
END
- Remarquez l'utilisation du caractère : qui permet
d'améliorer la
3.6.2 REPEAT
lisibilité.
.<.. UNTIL
Voyons un exemple de cet autre type de boucle
90
100
110
120
130
140
REM DEVINETTE D'UN CHIFFRE CHOISI PAR ORIC
NB#%=INT(9*RND(1))
REPEAT
INPUT "ENTREZ UN CHIFFRE"; C#
NCX=NCZ+1
UNTIL (NB%=C#)
PRINT “VOUS AVEZ TROUVE EN";NC#;" COUPS"
ON NC% GOTO 90, 90, 90, 110, 110, 110,
130, 130, 130
PRINT “CHANCE EXCELLENTE"
END
PRINT “CHANCE MOYENNE"
END
PRINT “PAS DE CHANCE"
END
— 88 -
Ce qui peut se traduire littéralement par
“Répéter les instructions situées entre REPEAT et
UNTIL jusqu'à ce que la réponse au test soit positive".
La fonction de cette boucle est donc un peu différen-
te de FOR ... TO ... NEXT ... car c'est à vous de prévoir
les itérations successives et les incrémentations sur la
variable testée. Cette possibilité d'incrémenter à l'aide
d'une fonction quelconque apporte plus de souplesse, mais
il se peut que l'on ne puisse sortir de la boucle.
Exemple : 5 REPEAT
10 PRINT “JE BOUCLE SANS FIN, SANS FIN..."
15 UNTIL (I=1)
Vous voyez dans ce cas extrême que si vous n'incrémentez
pas suffisamment sur la “variable de boucle” qui est
testée, la boucle REPEAT ... UNTIL est sans fin (par ana-
logie avec la boucle FOR ... NEXT, on appelle variable de
boucle la variable sur laquelle s'effectue le test).
Pour reprendre la main faire [CTRL] [C] ou [RESET].
3.7 SOUS-PROGRAMMES
3.7.1 Présentation
La notion de sous-programme n'est pas évidente a
priori. Présentons-la dans un exemple.
10 X=0 : y=0
20 GOSUB 70
30 PRINT A
40 X=5 : Y=15
50 GOSUB 70
55 PRINT A
60 END
70 REM SOUS-PROGRAMME
80 IF (X=5) THEN PRINT X ELSE A=Y-X
90 IF (X=0) THEN PRINT X ELSE A=X-Y
100 RETURN
— 89 -
Un sous-programme est utile pour éviter de répéter
plusieurs fois des lignes d'instructions identiques, dès
que l'on utilise deux fois une même séquence basic.
La structure d'un programme utilisant un sous-
programme est la suivante
: a
150 GOSUB 1000 :
160 : 2000 RETURN
250 GOSUB 1000
260 : Rs
L'utilisation d'un sous-programme permet aussi de
décomposer un programme en parties simples à mettre au
point.
Sur cet exemple nous voyons que l'ordre GOSUB sert à
appeler le sous-programme. L'entier qui se trouve der-
rière ce mot est le numéro de ligne de la première
instruction du sous-programme. Cet entier doit être
explicité et non calculé. Cet entier doit bien entendu
correspondre à un numéro de ligne existant, sinon Oric
affichera le message d'erreur UNDEF'D STATEMENT IN (numé-
ro de ligne où figure le GOSUB erroné). Le mot RETURN
signifie au basic que le sous-programme est terminé. Donc
Oric ne reconnaît qu'une partie de programme est un sous-
programme que s'il y a un GOSUB indiquant le numéro de
ligne où commence le sous-programme, et un RETURN
indiquant sa fin. Les capacités de la machine sont telles
que l'on ne peut pas appeler plus de vingt-cinq sous-
programmes en même temps (ceci se réalise en construisant
des sous-programmes qui font appel à d'autres sous-
programmes). Si on le tente il y a affichage du message
OUT OF MEMORY
C'est pourquoi le programme suivant
1 GOSUB 100
5 END
100 I=1+1
[110 GOSUB 100
120 RETURN
est interdit puisque le sous-programme écrit sur les
lignes 100, 110 et 120 s'appelle lui-même.
00e
Dans ce cas précis, la machine considèrera, après la
25ème “itération” (appel du sous-programme par le sous-
programme) qu'il y a plus de 25 appels à des sous-pro-
grammes en même temps, et elle affichera donc le message
d'erreur ci-dessus.
Pour la cohérence des programmes, il est vivement
conseillé d'entrer dans un sous-programme par un GOSUB et
d'en sortir par l'ordre RETURN ; et non d'utiliser l'or-
dre GOTO.
3.7.2 ON ... GOSUB
Cet ordre est similaire à l'ordre ON ... GOTO, dans
une certaine mesure, ainsi que nous allons nous en rendre
compte avec l'exemple qui suit
5 FOR I=1 TO 2
10 ON I GOSUB 100,200 : NEXT I
15 END
100 PRINT "LORSQUE I=1 LE SOUS-PROGRAMME DE
LA LIGNE 100 EST APPELE"
110 RETURN
200 PRINT “LORSQUE I=2 LE SOUS-PROGRAMME DE
LA LIGNE 200 EST APPELE"
210 RETURN
Vous voyez donc que ON ... GOSUB fait la même chose
que ON ... GOTO, à ceci près que GOTO provoque un trans-
fert inconditionnel alors que GOSUB est un appel à un
sous-programme. Nous vous rappelons donc les règles de
syntaxe à respecter
1, qui correspond à la position des étiquettes der-
rière GOSUB, doit être entier (en fait non alphanuméri-
que), et compris entre 0 et 255.
Si I est nul, ou si I est plus grand que le nombre de
numéros de ligne situés derrière GOSUB, alors l'ordre ON
... GOSUB est ignoré (ne provoquera pas d'appel à un
sous-programme). Bien entendu, les numéros de ligne sont
entiers et explicités, ils correspondent à des numéros de
ligne existant dans le programme.
_— 91 -
3.7.3 CALL
Exemple : CALL A
Cet ordre est un appel à un sous-programme écrit en
code machine (aussi appelé langage machine).
A est un entier en base hexadécimale qui indique
l'adresse, en mémoire de la machine, de la première ins-
truction du sous-programme.
L'utilisation du langage machine demande beaucoup de
précaution dans la mesure où l'interpréteur basic de
votre Oric ne peut pas en contrôler la validité.
De plus, vous devez être absolument certain que les
instructions que vous allez utiliser ne vont pas “pol-
luer"” les zones mémoires réservées au basic de l'Oric.
Dans le cas où vous modifiez le contenu de ces mémoires,
il se pourrait que vous ne puissiez même pas revenir au
programme basic qui appelait le sous-programme en langage
machine.
3.7.4 DEF USR
Exemple : DEF USR=A avec À entier en base hexadécimale.
Cette instruction permet de définir l'adresse en
mémoire de la première ligne d'un programme écrit en lan-
gage machine.
3.8 LES FONCTIONS
3.8.1 Fonctions numériques internes
Plusieurs fonctions numériques existent dans le basic
de l'Oric. Ces fonctions sont monovariables, c'est-à-dire
qu'elles n'agissent que sur UNE seule variable.
Nous donnons ci-dessous une liste de ces fonctions
sans les expliquer en détail, car elles ont été déjà uti-
lisées précédemment, ou bien elles demandent d'importan-
tes connaissances mathématiques.
— GENERATION D'UN NOMBRE ALEATOIRE
RND(X) retourne un nombre aléatoire compris entre 0 et 1.
_- 92 -
,
si X est positif, un nouveau nombre est généré à
chaque appel,
si X est nul, le dernier nombre est généré à nouveau,
si X est négatif, le nombre correspondant à X est
PR RP TT fa ED. S. , — »
générée (table de nombres en mémoire).
— FONCTIONS MATHEMATIQUES SIMPLES
ABS(X) valeur absolue de X
INT(X) partie entière de X (plus grand entier infé-
rieur à X
SGN(X) signe de X
SQR(X) racine carrée de X
— FONCTIONS MATHEMATIQUES COMPLEXES
ATN(X) arctangente de X
COS(X) cosinus de X
EXP(X) exponentielle de X
LN(X) logarithme népérien de X
LOG(X) logarithme décimal de X
SIN(X) sinus de X
TAN(X) tangente de X
Ces fonctions sont décrites avec plus de détails en
annexe A.
3.8.2 Fonctions traitant les chaînes de caractères
Oric offre plusieurs fonctions à une seule variable
permettant de manipuler les chaînes de caractères. Cel-
les-ci peuvent se classer en trois groupes
- conversion code ASCII/caractère et réciproque
- conversion chiffre/caractère et réciproque
- manipulation, extraction de chaînes de caractères
— 93 —
- FONCTIONS DE CONVERSION CODE ASCII/CARACTERE
Ces fonctions sont utiles pour avoir accès à des
caractères spéciaux, ou pour accéder directement à la
représentation des chaînes de caractères en mémoire.
CHR$S(X) génère le caractère de code ASCII égal à X
0 £<X< 31 caractères spéciaux
32<X <128 lettres et chiffres
ASC(X$) fournit le code ASCII du premier caractère de
la chaîne XS.
Exemple : 10 PRINT CHR$S(65) donne le caractère A
10 PRINT ASC("A") donne la valeur 65
- FONCTIONS DE CONVERSION CHAINE DE CARACTERES /NOMBRE
Ces fonctions sont utiles si l'on veut par exemple
demander dans un programme l'entrée d'une donnée qui peut
être une lettre (A-Z), ou un chiffre (0-9).
STRS(X) crée une chaîne contenant les chiffres X
Exemple : 10 AS=STRS(45)
Après exécution de cette instruction, la va-
riable alphanumérique A$ contiendra les ca-
ractères "45".
VAL(XS) est l'entier correspondant à la valeur numé-
rique de la chaîne
Exemple : 10 B$="1579ABC"
20 C=VAL(B$)
Après exécution des instructions 10 et 20, la
variable numérique contiendra la valeur 1579.
— FONCTIONS DE TRAITEMENT DE CHAINES DE CARACTERES
Plusieurs fonctions du basic de l'Oric permettent
d'extraire des caractères ou des sous-chaînes d'une
grande chaîne.
LEFTS(AS,X) crée la chaîne constituée des X premiers
caractères de A$.
Exemple : 10 CS=LEFTS("ABCDEFGHIJ",3)
La variable alphanumérique C$ contiendra ABC.
— 94 —
La fonction RIGHTS joue le même rôle que LEFTS, mais
en extrayant les caractères à partir de la droite.
Exemple : RIGHTS$("0123456",4)="3456"
Il est possible d'extraire des caractères situés au
milieu d'une chaîne de caractères.
La fonction MIDS(A$,D,X) a un argument supplémentaire
qui est le rang, dans la chaîne, du caractère à partir
duquel on désire effectuer l'extraction.
Exemple : MIDS("0123456",3,4)="2345"
Deux autres fonctions encore existent, qui traitent
les chaînes de caractères.
LEN(AS$) fournit la longueur de la chaîne A$
Exemple : LEN("0123456")=7
+ est un opérateur de concaténation (mise bout à
bout) de chaînes de caractères.
Exemple : "01"+"23456"="0123456"
3.8.3 Création de fonctions utilisateurs
Supposez que dans un programme vous ayez besoin - à
de nombreuses reprises et sans possibilité d'utiliser des
boucles - d'une fonction du type :
sin(5x)+3x2exp(xt3)+ABS(L/xtcosx)
Vous vous rendez bien compte qu'il serait vite fasti-
dieux de réécrire à chaque fois cette expression numéri-
que. C'est pourquoi votre Oric dispose d'instructions
permettant de construire vos fonctions et de vous en
servir comm de fonctions internes de la machine.
Ces instructions sont
DEF FN ... pour la construction de la fonction
FN ... pour son appel
_- 95 -
Exemple d'utilisation :
— construction de la fonction “explicite” :
1000 DEF FNA(X)=SIN(5*X)+3*X#*X#EXP (X+3 )+ABS((1/X)+COS(X))
La syntaxe est donc DEF FN nom de la fonction =
expression numérique ou alphanumérique. Le nom de la
fonction suit les règles de formation des noms de varia-
bles, c'est-à-dire :
. le premier caractère du nom est alphabétique (A,
+, Z majuscule) ;
. les autres caractères du nom sont alphanumériques
(A, cc, Z, O0, ..., 9) 3
. seuls les deux premiers caractères sont pris en
compte par la machine pour caractériser la fonction ;
. pas de mots réservés dans les noms de fonctions.
Les fonctions peuvent être numériques ou alphanumériques.
Ainsi
DEF FNA(X) définit une fonction numérique (réelle).
DEF FNA$(X) définit une fonction alphanumérique.
Bien entendu l'expression derrière le signe = doit
être du même type que la fonction.
Ce sont les caractères FN placés devant le nom de la
fonction qui indiquent à l'interpréteur basic qu'il n'est
pas en présence d'une variable indicée.
Les “appels” à la fonction utilisateur s'effectuent
de la façon suivante.
Sur l'exemple précédent :
2005 PRINT FNA(5)
En fait vous devez faire comme si (FN nom de la fonc-
tion) était le nom de votre fonction et vous en servir
comme d'une fonction interne à la machine. De plus sa
définition doit précéder son utilisation.
= 96 -
Bien entendu ces fonctions dites explicites sont, ainsi
que les fonctions internes, dépendantes d'une seule
variable. Si vous avez besoin de fonctions agissant sur
plusieurs variables vous ferez appel à ce qui a été vu au
paragraphe précédent : les “sous-programmes"”.
3.9 LES ORDRES D'ENTREES/SORTIES
Les instructions que nous allons voir permettent
d'échanger des informations entre l'extérieur (c'est-à-
dire vous) et le microordinateur. Certaines de celles-ci
vous sont déjà familières.
3.9.1 INPUT
Exemple d'utilisation :
5 INPUT "ENTREZ LES DONNEES" ,1l;I,,1$
RUN
Lorsque l'interpréteur basic rencontre cet ordre, il
écrit le commentaire suivant
ENTREZ LES DONNEES ?
et il attend que vous entriez les données (tant qu'elles
ne sont pas entrées, le programme est stoppé). Pour en-
trer les données vous pouvez faire ainsi :
1.23,4.50 E3,"TOTO" [RETURN]
les trois données sur la même ligne séparées par une
LL LL
22
Ou bien ? 1.23 [RETURN]
2? 4.50 E3 [RETURN]
22 “TOTO" [RETURN]
et toutes solutions intermédiaires entre ces deux extréê-
mes.
Les données ne sont prises en compte que si vous
tapez sur [RETURN], donc toute donnée peut être corrigée
avant d'actionner cette touche. Par contre les données ne
- 97 -
sont pas conservées d'une exécution sur l'autre, ce qui
oblige à les retaper toutes à chaque exécution. Bien
entendu, vous devez entrer autant de données qu'il y a de
variables derrière INPUT, et les données doivent être du
même type que les variables auxquelles elles sont affec-
tées.
3.9.2 GET
Exemple d'utilisation
5 GET A
10 PRINT A
RUN
Lorsque vous utilisez cette instruction, le basic
attend une donnée constituée d'un seul caractère, qui est
soit numérique (0-9) si la variable est réelle, ou quel-
conque si la variable est alphanumérique (le caractère
est tout de même différent de “). L'exécution est arrêtée
tant que le caractère n'est pas tapé sur le clavier. Le
basic prend en compte le caractère dès que vous le tapez
sur le clavier (pas besoin de [RETURN] pour enregistrer
la donnée). Le caractère tapé n'apparaît pas sur l'écran
(aucun moyen de correction possible par l'opérateur.
Correction par le programme).
3.9.3 KEYS
Exemple d'utilisation
5 REPEAT
10 PRINT “TAPEZ SUR + POUR ARRETER"
15 UNTIL (KEY$="+")
20 END
KEY$ effectue grosso modo la même chose que GET, dans
la mesure où on rentre un caractère du clavier ; mais la
différence fondamentale est que le programme n'est pas
stoppé si vous ne répondez pas (si vous n'entrez pas de
données). Cet ordre est donc essentiel pour les jeux
(graphiques en particulier), qui seront abordés au pro-
chain chapitre.
— 98 -
3.9.4 READ -— DATA
Exemple d'utilisation :
5 READ A,B,C$
20 PRINT A,B,C$
50 DATA 1.253,454,"TOTO"
60 END
READ assigne aux variables A, B, C$ des valeurs sto-
ckées pour une instruction DATA. READ joue à peu près le
même rôle que INPUT, sinon qu'au lieu de rentrer les don-
nées en cours d'exécution, elles sont entrées dans le
programme grâce à des instructions DATA. Les caractères
séparant les données dans les instructions DATA sont des
virgules. La syntaxe est :
READ variable 1, variable 2, ...
Si variable 1 est la nifæ variable rencontrée
depuis le début du programme dans un ordre READ, elle
recevra la valeur de la n°" donnée stockée dans un
ordre DATA ou dans des ordres successifs. Bien entendu la
valeur de la n donnée et n variable doivent
être, de même type. Cette assignation n°°% variable -
n donnée est rendue possible grâce à un “pointeur
de liste de données" qui passe d'une donnée à une autre
au fur et à mesure de leur lecture.
3.9.5 RESTORE
Cet ordre permet de remettre le “pointeur de données"
à sa position initiale.
Exemple d'utilisation :
5 READ A,B,A$
10 RESTORE
15 READ A1,B1,A1S
20 PRINT A,B,AS$,A1,B1,A1S
25 DATA 1,0,"LE CHAPITRE EST FINI"
30 END
2.902
3.10 CONCLUSIONS
Au cours de ce long chapitre nous avons vu les ordres
basic qui constitueront la charpente de vos programmes.
Nous avons essayé de vous sensibiliser à certains
aspects de la programmation et à certaines méthodes per-
mettant d'améliorer vos programmes. Pour bien saisir
toutes les possibilités de ces instructions, vous devrez
vous armer d'un peu de patience et surtout vous entraîner
à faire vos propres programmes.
Dans les prochains chapitres vous allez apprendre à
vous servir d'instructions plus distrayantes, permettant
d'utiliser les possibilités graphiques et sonores de
votre Oric.
— 100 -
CHAPITRE 4
Possibilités
graphiques
de l'oric
4.1 INTRODUCTION
Au moment où vous entamez la lecture de ce chapitre,
vous avez déjà amplement fait connaissance avec votre mi-
croordinateur. Vous avez, en effet, appris à jouer et à
converser avec votre machine ; vous avez également com-
mencé à programmer, en utilisant le langage BASIC, ce qui
vous permet d'ores et déjà de concevoir des programmes
relativement élaborés.
Pourtant il vous reste encore à découvrir toute la
gamme de possibilités mise à votre disposition par Oric,
et à compléter l'ensemble des commandes basic rencontrées
jusqu'à présent.
Votre microordinateur va en effet vous permettre de
réaliser des graphiques simples, complexes, colorés,
immobiles, mouvants, ou encore clignotants si vous le
désirez. Il vous permettra également de construire des
sons, ou même des morceaux de musique si vous êtes
passionné de solfège.
Inutile de préciser le parti que vous pouvez tirer de
ces capacités sonores et graphiques pour améliorer la
richesse et la variété de vos jeux, ou simplement agré-
menter vos programmes par des couleurs ou des sons.
— 101 -
Nous commencerons par présenter les possibilités
graphiques en définissant tout d'abord les divers modes
graphiques que vous utiliserez, puis en passant en revue
les commandes de chaque mode.
4.2 LES MODES GRAPHIQUES
On peut classer ces modes en deux groupes :
Le premier est constitué par les modes graphiques
basse résolution.
le second groupe comprend le mode unique correspon-
dant aux graphiques haute résolution.
Nous allons préciser, dans les paragraphes suivants,
les notions de mode,;et de haute ou basse résolution.
4.2.1 Les modes basse résolution
TEXT, LORES O0, LORES 1, sont les noms des trois modes
graphiques composant le premier groupe. Vous connaissez
très bien le premier d'entre eux : TEXT, puisque c'est
celui que vous avez utilisé jusque là.
Qu'est-ce qu'un mode graphique ?
Un mode graphique, avec l'ensemble des commandes
qu'il comprend, constitue une option qui conditionne la
manière d'écrire ou de faire imprimer un point ou un ca-
ractère sur l'écran.
Décrivons le mode TEXT pour préciser davantage. Lors-
que vous mettez Oric en marche, c'est ce mode qui appa-
raît automatiquement. Comme vous l'avez remarqué, vous
disposez, en mode TEXT, de la totalité de l'écran pour
écrire vos programmes ou lancer vos ordres, hormis la
première colonne sur laquelle vous ne pouvez pas écrire.
Lorsque toutes les vingt-sept lignes de l'écran ont été
utilisées, celles-ci défilent vers le haut, jusqu'à lais-
ser apparaître une ligne libre en bas de l'écran.
Jusqu'à présent, vous n'avez utilisé le mode TEXT que
— 102 -
pour des besoins d'écriture. Vous allez maintenant ap-
prendre à vous en servir pour réaliser vos premiers des-
sins, grâce aux commandes qui seront détaillées dans les
paragraphes suivants.
Mais auparavant, présentons les deux autres modes
graphiques basse résolution : LORES 0 et LORES 1.
On passe du mode TEXT au mode LORES O0 ou LORES 1 en
tapant LORES O ou LORES 1 ; on repasse au mode TEXT en
tapant TEXT. Le nom du mode peut donc être considéré com-
me une commande permettant d'accéder à ce mode, commande
qu'on peut utiliser dans un programme.
Après avoir tapé : LORES 0, vous voyez l'écran se
transformer. Vous constatez alors que le fond de l'écran
devient noir à l'exception de la ligne du bas et des deux
premières colonnes. Le curseur se trouve dans cette der-
nière ligne. Si vous y écrivez, vous verrez la surface en
fond noir diminuer au fur et à mesure que vous introdui-
sez de nouvelles lignes. Les premières colonnes à gauche
sont inaccessibles à l'écriture.
Vous avez peut-être déjà tapé LORES 1. Là encore,
l'écran se transforme de la même façon que pour LORES O0.
Mais quoi que vous essayiez de taper, vous verrez appa-
raître à la place des caractères attendus (et habituels)
des blocs aux formes étranges. Vous venez de prendre
contact avec la “forme alternée des caractères", et en
même temps de mettre en évidence la seule différence
entre les modes LORES O0 et LORES 1.
Vous n'aviez jusqu'ici utilisé que la “form stan-
dard” des caractères, à laquelle nous sommes tous habi-
tués ; c'est celle que nous rencontrons en mode TEXT ou
en mode LORES O0.
Mais quelle que soit la représentation choisie :
forme standard en mode TEXT ou LORES 0, ou forme alternée
en mode LORES 1, les caractères ont toujours la même
signification. Ainsi, l'ordre "PRINT", commun aux trois
modes, exerce la même action en mode LORES 0 ou en mode
LORES 1.
En mode TEXT, la première colonne de gauche abrite un
— 103 -
paramètre contrôlant la couleur du fond de l'écran ; la
seconde abrite un paramètre contrôlant la couleur de
l'avant-plan, des caractères. En mode LORES (0 ou 1)
apparaît un paramètre supplémentaire - contrôlant les
formes standard ou alternées des caractères - qui est
placé dans la première colonne de gauche.
Il y a près d'une centaine de caractères (A, , ,S$,
etc...). À chacun d'eux on peut associer une forme étran-
ge, qui est la forme alternée du caractère. Le nombre et
la variété de ces nouveaux caractères vous permettront de
construire des dessins originaux en associant les blocs
les uns aux autres.
Comment obtenir la forme alternée d'un caractère
standard, d'une manière simple et rapide ? L'instruction
suivante vous le montre.
PRINT 65, CHR$S(27);"1";CHR$S(65)
Vous verrez alors s'imprimer 65 et plus loin un bloc
correspondant au caractère alterné de A. En effet, 65
représente le nombre code ASCII du caractère A. (ASCII
pour American Standard Code for Information Interchange).
Vous trouverez en annexe la liste des codes ASCII de tous
les caractères ; ce sont des nombres compris entre 32 et
125. La commande permettant d'obtenir le caractère cor-
respondant à son nombre code est CHR$ ; ainsi CHR$(65 )=A.
Vérifiez-le en tapant
PRINT CHRS(65)
La commande réciproque permettant d'obtenir le code
ASCII d'un caractère est ASC :
ASC("A")=65
Mais 27 est inférieur à 32 : il ne représente donc
pas un nombre code ASCII. Ici, 27 est un attribut, c'est-
à-dire qu'on peut lui faire jouer un rôle particulier.
Par exemple ici l'ensemble CHR$(2/7);"I" a pour action de
sélectionner la forme alternée de CHR$S(65). Si vous sup-
primez CHR$(27);"l"; et tapez : PRINT 65, CHR$(65), vous
verrez À s'imprimer après 65.
- 104 -
Vous pouvez bien sûr remplacer 65 par tout autre nom-
bre compris entre 32 et 125, mais vous devrez garder
CHR$S(27);"1l".
Exemple : PRINT 100, CHR$S(27);"I";CHR$(100)
27 n'est pas le seul attribut pouvant être utilisé
après CHR$. Les nombres entre 0 et 31 peuvent être consi-
dérés comm attributs.
Employés avec CHR$, ils ont surtout un intérêt pour
les sorties sur imprimante. Ils permettent entre autre de
choisir la grandeur des lettres, ou de faire avancer le
papier, etc... Certains ont cependant une action sur les
sorties écran ; tapez
PRINT CHR$(12)
Vous obtiendrez un résultat équivalent à celui de l'ordre
CLS.
Nous utiliserons par la suite CHR$ avec d'autres
attributs en particulier 8 et 9.
Nous n'avons fait, pour l'instant, que présenter les
trois modes graphiques basse résolution. Il est temps
d'entrer plus avant dans les détails.
Commençons par expliciter le terme basse résolution.
En mode LORES O0, et LORES L ou TEXT, l'écran est
divisé en un certain nombre d'unités élémentaires : des
cellules, qui constituent un quadrillage de cet écran.
Ces cellules sont de petits carrés : il y en a 39 colon-
nes verticales, et 27 lignes horizontales.
26 IE
Ces cellules, comme on peut le voir sur le schéma,
sont numérotées de O à 38 dans le sens horizontal et de 0
à 26 dans le sens vertical.
— 105 -
En fait, ce quadrillage peut servir à constituer un
repère formé d'une origine et de deux axes. L'origine
sera, par définition, le coin en haut et à gauche de
l'écran, les deux axes seront x et y définis par le
schéma
x horizontal de gauche à droite ;
y vertical de haut en bas.
La cellule de coordonnées x et y dans ce repère est
donc repérée par le couple (x,y) comme l'indique l'exem-
ple sur le schéma. O<x <38, O<y <26, x et y sont
comptés à partir de l'origine.
La taille des cellules est telle qu'un caractère,
quel qu'il soit, occupe exactement une cellule.
Cette division de l'écran constitue ce que l'on ap-
pelle la basse résolution. En effet il est possible de
diviser l'écran beaucoup plus finement encore : c'est
l'objet du mode haute résolution.
4.2.2 Le mode haute résolution
Il se nomme HIRES ; son nom, comme celui des autres
modes, constitue une commande qui permet d'accéder à ce
mode.
Ayant tapé HIRES vous voyez alors le fond de l'écran
devenir noir, mais constatez aussi qu'il reste au bas de
l'écran trois lignes de mode TEXT. Ces trois lignes cons-
tituent une fenêtre qui vous permet de formuler des com-
mandes (et surtout de voir ce que vous écrivez), tout en
ayant sous les yeux les dessins que vous êtes en train de
tracer.
Nous sommes en haute résolution : la division de
l'écran en unités élémentaires est donc beaucoup plus
fine qu'en basse résolution. Les cellules des modes TEXT
et LORES sont devenues des pixels, c'est-à-dire des
points, constituant l'élément graphique de base.
Tapez : CURSET 120,100,1 (en mode HIRES)
Vous verrez apparaître un point au centre de l'écran qui
vous montrera ce qu'est un pixel. (Nous reviendrons bien
sûr sur la commande CURSET tout-à-l'heure).
— 106 -
Horizontalement, l'écran est divisé en 240 pixels,
tandis que verticalement, il est divisé en 200 pixels. En
mode HIRES, tout l'écran est disponible en largeur pour
l'impression des pixels.
On peut là encore élaborer un repère à partir du
maillage constitué par les pixels. L'origine est toujours
le coin haut à gauche de l'écran, un axe x horizontal va
de gauche à droite, un axe y vertical va de haut en bas.
o4t3 239
“..
Lignes en
mode TEXT
Les pixels sont numérotés de O0 à 239 horizontalement, et
de O0 à 199 verticalement.
Voici donc présenté ce mode haute résolution graphi-
que.
Si vous cherchez à comparer les divers modes graphi-
ques, vous constaterez que TEXT et LORES O sont très
proches l'un de l'autre. Nous avons vu ce qui différen-
ciait LORES 1 de LORES O0.
Quant au mode HIRES, nous pouvons dire qu'il n'a rien
de commun avec les trois premiers, si ce n'est les trois
lignes de mode TEXT. Nous verrons qu'également, au niveau
des commandes, LORES O0, LORES 1 et TEXT sont assez voi-
sins l'un de l'autre (les commandes diffèrent peu ou pas
d'un mode à l'autre).
Par contre le mode HIRES a des commandes qui lui sont
spécifiques.
Les premières commandes graphiques que l'on va intro-
duire sont des commandes communes aux quatre modes TEXT,
LORES O0, LORES 1 et HIRES. Elles concernent les couleurs.
— 107 -
On distingue les couleurs d'arrière-plan ou “papier”
et les couleurs d'avant-plan : l'encre". Il y a donc
deux commandes qui sont
PAPER N
et INK N
où N est un nombre variable compris entre 0 et 7, qui
contrôle la couleur, suivant le tableau suivant
noir
rouge
vert
jaune
bleu
nagenta
cyan
blanc
YOU 5 &w ND ©
Essayez ces deux commandes, jusqu'à trouver les cou-
leurs du fond d'écran, et les caractères qui vous con-
viennent le mieux. Bien sûr, si l'encre et le papier sont
de même couleur vous ne voyez plus rien.
Tapez : 10 FOR A = O TO 7
20 FOR B = 7 TO O STEP -1
30 INK À : PAPER B
40 WAIT 100
50 NEXT B
60 NEXT À
4.3 LES COMMANDES GRAPHIQUES
4.3.1 Commandes graphiques basse résolution
La première commande rencontrée sera PLOT X,Y,A$.
Utilisons-la tout de suite.
Vous êtes en mode TEXT ou LORES O (ou LORES 1)
Tapez
PLOT 15,10,"BONJOUR"
— 108 -
En mode TEXT et LORES 0, BONJOUR va aller s'imprimer
au milieu de l'écran, le caractère B occupant la cellule
(15,10). En LORES 1, le résultat sera le même, mais
BOUJOUR (comme d'ailleurs votre commande) sera écrit sous
forme alternée.
PLOT x,y,A$ placera donc le premier caractère de la
chaîne A$ dans la cellule de coordonnées x, y. Attention
à ne pas sortir de l'écran en donnant un x ou un y trop
grand. Si vous tapez
PLOT 10,10,"H"
vous verrez apparaître un H sur l'écran. À la place d'une
chaîne alphanumérique, on peut aussi mettre un nombre,
pour le troisième argument de PLOT. Ainsi, tapez :
H=65
PLOT 15,10,H
La caractère A apparaît, car 65 est le code ASCII de
A.
Voici un programme utilisant les formes alternées des
caractères et la commande PLOT. Il s'agit d'un balayage
horizontal de l'écran par des caractères de forme alter-
née. Ceci montre l'importance de la commande PLOT, qui
vous permet de placer facilement un caractère et de le
faire évoluer sur l'écran, ce qui peut avoir un grand
intérêt pour les jeux.
1 REM *%** BALAYAGE *%%
5 LORES 1
6 A=0:C$=" "
10 A$="61"
20 REPEAT
30 FOR B=0 TO 35
40 PLOT B,A,A$
50 PLOT B,A,C$
60 NEXT B
70 A=A+1
80 FOR C=35 TO O STEP-1
90 PLOT C,A,A$
100 PLOT C,A,C$
110 NEXT C
120 A=A+1
130 UNTIL A=26
— 109 -
Ce programme vous montre comment créer l'illusion du
mouvement : voir les lignes 40 et 50, ou les lignes 90 et
100.
Si vous voulez avoir les caractères standard, rempla-
cez en ligne 5 LORES 1 par LORES O.
Si vous êtes exigeant au point de vouloir mélanger
les deux types de caractères, vous en avez la possibili-
té. Voyons comment.
On utilise deux expressions qui ont une action réci-
proque l'une sur l'autre. L'expression CHR$S(8) permet,
lorsqu'on est en mode LORES 1, de faire apparaître des
caractères standard.
L'expression CHR$(9) permet, réciproquement, lors-
qu'on se trouve en mode LORES 0, d'obtenir des caractères
de type alterné. De plus, CHR$(9) peut servir, en LORES
1, à revenir aux caractères de type alterné, après utili-
sation de CHR$(8).
De même, CHR$S(8) sert, en LORES 0, à retrouver les
caractères de type standard après utilisation de CHR$(9).
(Souvenez-vous que pour x< 31, CHR$(x) exerce une action
particulière, et ne donne un caractère que pour x >32, x
étant le nombre code ASCII de ce caractère).
Comment utilise-t-on CHR$S(8) et CHR$(9) dans la pra-
tique ?
Les manipulations suivantes fournissent la réponse.
Tapez : 10 LORES 1
20 A$=CHR$(8)+"BONJOUR"+CHRS(9)
30 B$="LORES 1"
40 PLOT 15,10,B$
50 PLOT 15,12 ,A$
puis : 10 LORES 0
20 A$=CHR$S(9)+"BONJOUR"+CHRS(8)
30 B$="LORES 0"
40 PLOT 15,10,B$
50 PLOT 15,12,A$
— 110 -
La concaténation (opération rencontrée aux lignes
20), permet, lorsque l'on est en LORES 1 par exemple, de
considérer à l'exécution de la commande PLOT 15,12,A$, la
chaîne de caractères : BONJOUR, comme filtrée par CHR$(8)
ce qui va la faire imprimer en caractères standard. L'im-
pression de BONJOUR une fois réalisée, CHR$S(9) fait reve-
nir à la forme originale.
La seconde commande est SCRN(x,y). SCRN vient de
SCREEN (écran en anglais). Son but est d'aider l'utilisa-
teur à connaître le caractère qui occupe la cellule de
coordonnées x, y sur l'écran.
Ainsi, après avoir tapé CLS pour nettoyer l'écran, si
vous effectuez la commande PLOT 10,15,"H", vous verrez
bien sûr apparaître la lettre H dans la cellule de coor-
données 10, 15. Tapez alors :
PRINT SCRN(10,15)
Le nombre 72 vous sera alors fourni ; c'est en effet
le code ASCII du caractère H.
Peut-être vous demandez-vous comment on peut utiliser
cette commande. L'exemple qui suit vous montre les servi-
ces qu'elle peut rendre dans un jeu.
1 TEXT
5 C$=" "
10 FOR N=1 TO 8
12 M=N+8
20 PLOT 10,M,"O"
30 NEXT N
40 C=2
50 A=INT(RND(1)*26)
60 REPEAT
70 PLOT C,A,"X"
80 WAIT 4
90 PLOT C,A,C$
100 IF SCRN(C+1,A)=79 THEN C=34
110 C=C+1
120 UNTIL C=35
130 GOTO 40
- 111 -
A la ligne 100, 79 représente le code ASCII de O0. On
utilise alors le résultat numérique fourni par SCRN pour
tester si au coup suivant le "X" atteindra le "O0".
Terminons ce paragraphe sur les commandes basse réso-
lution par l'utilisation des couleurs, et des attributs.
Tapez : 10 LORES O0 : F=0
20 C=0:A=10:B=10
30 R=10:D=2*P1/50
40 REPEAT
50 PLOT A+R*SIN(C) ,B+R*COS(C) ,18+F
60 C=C+D:IF C >2%*PI THEN F=1
70 UNTIL C >4%PI
Commentaires :
La ligne 30 définit D comme l'incrément de l'angle
dont on tourne pour placer les cellules les unes après
les autres. La ligne 20 définit le centre du cercle par À
et B, et le rayon par R. La ligne 50 choisit les couleurs
des diverses cellules ; nous reviendrons sur ce point.
D doit être suffisamment grand pour qu'on puisse
passer d'une cellule à la suivante assez rapidement.
cellule
centre D
Mais surtout, il ne doit pas être trop grand, sinon les
cellules ne seront plus jointives.
cellule
centre
cellule
D'autre part, x=A+R*sin(C) a peu de chances d'être en-
tier. Comment la commande PLOT va-t-elle interprêter ces
coordonnées non entières ? Elle va simplement choisir la
cellule correspondant à INT(x),INT(y). C'est-à-dire que
PLOT x,y,'A" est équivalent à PLOT INT(x),INT(y),"A".
Vérifiez-le sur plusieurs exemples.
— 112 -
Parlons maintenant des couleurs et attributs. Vous le
constatez : grâce à ce programme, on peut faire interve-
nir la couleur après la commande PLOT, par le choix des
attributs de couleur. Les attributs considérés dans le
programme contrôlent la couleur du papier (de la cellu-
le). Ils sont alors compris entre 16 et 23, c'est-à-dire
qu'ils valent 16+N, N variant de O0 à 7. Les attributs
D
correspondant à l'encre varient de O à 7.
En mode LORES, la commande PLOT suivie d'un ordre de
couleur, ne colorie qu'une cellule : tapez
LORES O
PLOT 10,15,20
Si par les commandes INK ou PAPER vous changez l'encre ou
le papier, vous ne changerez pas la couleur de cette
cellule, et le fond - en LORES - restera toujours noir.
Mais en mode TEXT, PLOT suivi d'un attribut de cou-
leur, colore la cellule choisie, mais également toute la
4
ligne ou partie de ligne à droite de cette cellule.
Tapez : TEXT : PAPER 7
PLOT 15,15,17
PLOT 20,15,23
Vous pouvez ainsi obtenir des surfaces quelconques
colorées comme vous le voulez. Ici encore les ordres
PAPER ou INK ne changent pas la couleur des cellules que
vous avez colorées. Mais d'autres commandes PLOT sur ces
cellules en changent bien sûr la couleur.
Les attributs de couleur sont donc les nombres de 0 à
7 pour l'encre, et de 16 à 23 pour le papier. Tous les
attributs sont compris entre O0 et 31. Vous trouverez en
annexe H leur liste et leur action. Mais montrons le rôle
de l'attribut 12 tout de suite à titre d'exemple.
Tapez : 1 TEXT
5 FOR N=1 TO 24
10 PRINT “TEXTE POUR REMPLIR L'ECRAN"
20 NEXT N
30 PLOT 10,10,5
40 PLOT 11,11,18
50 PLOT 12,12,12
- 113 -
Vous constatez que l'attribut 12 produit un clignote-
ment. Vous constatez également que les attributs n'affec-
tent que les cellules situées à leur droite, et qu'une
cellule est affectée par la commande PLOT + ATTRIBUT,
située la première à sa gauche.
Enfin si vous tapez
LORES 0
PLOT 10,10,19.1
Bien que 19.1 ne soit pas entier, la commande fonction-
nera néanmoins 3; là encore, elle équivaudra à PLOT
10,10,INT(19.1).
4.3.2 Commandes du mode HIRES
Pour obtenir ce mode, il suffit de taper : HIRES.
La première commande va nous faire découvrir le
curseur HIRES. Cette commande est CURSET X,Y,FB. En
tapant CURSET 120,100,1 vous verrez alors apparaître un
point au centre de l'écran : c'est le curseur HIRES. X,Y
sont les coordonnées du pixel, du point de l'image repé-
rant le curseur. Pour la commande CURSET, elles seront
toujours repérées par rapport au coin haut et gauche de
l'écran.
Le troisième paramètre intervenant dans l'ordre CUR-
SET est le nombre code FB (pour Foreground, Background).
11 a quatre valeurs, c'est-à-dire :
FB = O0 couleur du fond (ou du papier des lignes
TEXT de la fenêtre)
1 couleur de l'encre
2 inversion des couleurs
3 sans effet
FB conditionne la manière dont sera imprimé le cur-
seur sur l'écran. Pour voir l'effet de ce nombre code,
tapez :
HIRES
CURSET 120,100,1
CURSET 120,150,2
CURSET 120,50,3
CURSET 100,100,0
- 114 -
A cette commande CURSET, on peut associer une comman-
de de même type : CURMOV X,Y,FB. La seule différence avec
CURSET, c'est que pour CURMOV, X et Y sont les coordon-
nées relatives à la dernière position du curseur.
Tapez : HIRES
CURSET 120,100,1
CURMOV 10,10,1
pour obtenir confirmation.
Attention à ne pas sortir de l'écran (Oric vous
enverrait un message d'erreur) : si À et B sont les coor-
données de la dernière position du curseur, on doit
respecter
0 £& X+A < 239
0 < Y+B < 199
On peut bien sûr tracer des traits avec CURSET ou
CURMOV mais cela oblige à placer le curseur successive-
ment sur tous les points du trait.
Il existe une commande simple permettant de tracer un
segment de droite : c'est l'ordre DRAW X,Y,FB. Il permet
de tracer un trait à partir de la dernière position du
curseur, jusqu'au point A+X, B+Y (si A et B étaient les
coordonnées de la dernière position du curseur). DRAW
déplace le curseur qui occupe désormais la position AK,
B+Y.
Exemple d'utilisation :
10 HIRES
20 CURSET 120,50,3
30 DRAW -50,50,1
40 DRAW 50,50, 1
50 DRAW 50,-50,1
60 DRAW -50,-50,1
Améliorons encore nos possibilités en passant à la
commande PATTERN.
PATTERN est un mot anglais signifiant modèle, ce qui
va prendre tout son sens.
= 115
Nous venons d'utiliser la commande DRAW, en ne tra-
çant que des traits continus. Vous voulez tracer facile-
ment et rapidement des traits mixtes ou pointillés ? Rien
de plus facile.
Avant tout, nous devons nous souvenir qu'Oric “pense”
en binaire, c'est-à-dire uniquement avec des 0 ou des 1
groupés par huit, formant alors un octet.
Un octet peut donc représenter des nombres allant de:
00000000 11111111 (binaire)
pe
0 255 (décimal)
C'est cette disposition de 0 ou de 1 à la suite les
uns des autres qui permet d'obtenir des traits interrom-
pus. Vous pouvez utiliser pour cela tout nombre entre 0
et 255 ; le trait obtenu sera interrompu selon la repré-
sentation binaire de ce nombre. Ainsi si vous tapez :
1 HIRES
5 CURSET 60,30,1
10 PATTERN 15
20 DRAW 120,0,1
15 en binaire s'écrit 00001111
Examinons le résultat obtenu. Vous constatez que les
quatre premiers points du trait ne sont pas imprimés, que
les quatre suivants le sont, et ainsi de suite.
Les quatre premiers points correspondent aux quatre 0
par lesquels commence le nombre 15 en binaire.
Les quatre suivants, vous l'avez compris, correspon-
dent aux quatre L par lesquels finit le nombre 15 en
binaire.
Si vous remplacez 15 par 170 - qui en binaire s'écrit
10101010, - vous obtiendrez des pointillés plus serrés.
Lorsque vous mettez Oric en marche, c'est le nombre
modèle 255 qui est sélectionné ; c'est pourquoi vous tra-
cez des traits pleins avec DRAVW.
— 116 -
Pour le moment, en mode HIRES, vous n'avez pu faire
imprimer des caractères que dans les trois lignes de mode
TEXT du bas de l'écran. Or, il existe une commande qui va
vous permettre de placer un caractère (ou plusieurs) sur
la partie haute résolution de l'écran, à l'endroit qui
vous plaît.
Cette commande est CHAR X,S,FB.
Vous êtes en mode HIRES. En tapant encore HIRES, vous
enlevez de l'écran tous les dessins qui s'y trouvaient.
Tapez alors CURSET 120,100,1 : vous voyez le curseur
HIRES se placer au centre de l'écran. Tapez maintenant
CHAR 65,0,1 : vous voyez alors la lettre "A" s'imprimer
au milieu de l'écran, là où se trouve le curseur HIRES.
Avant d'employer CHAR, vous devez donc choisir, par
la commande CURSET, l'endroit de l'écran où vous désirez
faire afficher un caractère. Puis, vous déterminez les
trois paramètres X,A,FB qui suivent l'ordre CHAR.
X est le code ASCII du caractère que vous voulez fai-
re imprimer ; ASC("A")=65.
S vaut O0 ou 1. Le O0 correspond à la forme standard
des caractères, le 1 à la forme alternée.
FB est le nombre paramètre déjà rencontré dans les
commandes CURSET, CURMOV ou DRAW, qui contrôle les cou-
leurs.
Voici un programme, qui vous montre comment utiliser
la commande CHAR.
10 HIRES
20 A$="BONJOUR"
30 CURSET 30,30,3
40 FOR N=1 TO 3
50 READ X,Y
60 FOR A=1 TO LEN(A$)
70 CHAR ASC(MIDS(AS,A,1),0,1)
80 CURMOV X,Y,0
90 NEXT A
100 NEXT N
110 DATA 10,10,0,10,10,-10
OUPS
LEN est une fonction donnant la longueur d'une chaîne
de caractères : LEN(AS).
MID$S(A$,A,L) ne considère les caractères de la chaîne
A$ qu'à partir du Aième et au nombre de L. Si A$=
"BONJOUR" MIDS(A$,3,2) équivaut à : NJ.
La commande que nous allons maintenant étudier va
vous permettre de tracer des cercles très facilement.
Elle se présente comme suit : CIRCLE R,FB.
R est un paramètre correspondant au rayon du cercle.
FB est le nombre paramètre contrôlant les couleurs
déjà rencontré. Pour tracer un cercle, vous devez con-
naître l'emplacement de son centre, et la valeur de son
rayon.
Vous pouvez déterminer la position du centre par la
commande CURSET.
Ainsi, si vous tapez
HIRES
CURSET 120,100,3
CIRCLE 50,1
Vous obtiendrez un cercle de rayon 60, dont le centre a
pour coordonnées 120 et 100. Attention à bien choisir la
position du centre et la valeur du rayon, afin de ne pas
sortir de l'écran.
Vos cercles sont tracés en trait plein. Mais comme
pour la commande DRAW, vous pouvez faire intervenir la
commande PATTERN pour obtenir des cercles en traits
interrompus.
10 HIRES
20 CURSET 120,100,3
30 FOR X=49 TO 1 STEP-2
40 CIRCLE X, 1
50 INK INT(X/7)
60 PATTERN 50-X
70 NEXT X
— 118 -
La commande suivante : POINT permet de déterminer si
un point, un pixel de l'écran est imprimé dans la couleur
de l'encre de l'arrière-plan, du papier, ou dans celle de
l'avant plan.
Si vous êtes passé du mode HIRES en mode TEXT, vos
dessins haute résolution ont bien sûr disparu, mais ils
sont cependant conservés dans la mémoire de l'écran.
Pour les enlever de la mémoire, vous devez taper NEW.
Revenons au mode HIRES. Tapez :
HIRES
CURSET 50,50,0
Tapez maintenant
TEXT
PRINT POINT(50,50)
Oric vous répond O0 puisqu'en effet le curseur était
imprimé dans la couleur du fond de l'écran (ou du pa-
pier). Si en mode HIRES, vous aviez tapé CURSET 50,50,1
c'est-à-dire si vous aviez fait imprimer le curseur dans
la couleur de l'encre, alors une fois revenu en mode TEXT
PRINT POINT(50,50)
vous aurait fourni comme réponse : -l (et non pas 1).
Passons maintenant à la commande la plus riche, sans
doute la plus performante, mais aussi la plus complexe.
11 s'agit de la commande FILL A,B,X.
Elle vous permet de remplir une portion de l'écran
(déterminée par vous) dans la couleur que vous avez choi-
sie. Ou encore, elle vous permet de faire clignoter les
dessins se trouvant dans une certaine région de l'écran.
Elle peut encore faire bien d'autres choses, et vous
découvrirez l'ensemble de ses innombrables possibilités à
l'usage.
FILL est suivi de trois paramètres A,B,X.
À correspond au nombre de lignes horizontales. En
mode HIRES, il y a 200 lignes de pixels.
= 119%
À est un paramètre qui contrôle le nombre de lignes
sur lequel FILL va agir. De même B est un paramètre con-
trôlant le nombre de colonnes sur lequel va agir cette
commande.
Quant à X, c'est le paramètre qui sert à obtenir la
nature de l'effet cherché : couleur, clignotement, etc...
Voici un petit programme qui dispose des couleurs à
l'aide de cette commande.
5 HIRES
10 FOR N=1 TO 22
20 FILL 3,1,17
21 FILL 3,1,18
22 FILL 3,1,19
24 NEXT N
Montrons d'abord le rôle du paramètre A.
Tapez : HIRES
FILL 10,1,17
FILL 30,1,18
Vous constatez deux choses
10 lignes se remplissent de rouge à la première com-
mande FILL ;
30 lignes se remplissent de vert à la seconde comman-
de FILL.
À contrôle donc bien le nombre de lignes sur lesquelles
va agir FILL.
Vous remarquez ensuite que le curseur HIRES se dépla-
ce lorsque vous donnez l'ordre FILL. En effet initiale-
ment, il était en (0,0) puis après le ler ordre FILL, il
est venu se positionner en (0,10), pour alors remplir les
lignes 10 à 40 de vert.
Tapez : CURSET 60,50,1
FILL 30,1,22
FILL 10,1,21
Cette fois, l'ordre FILL n'agit qu'à partir de la
position du curseur qui vient se repositionner sur la
même verticale lorsque l'ordre FILL est accompli, mais en
— 120 -
se décalant vers le bas du nombre de lignes modifiées par
l'ordre FILL.
Cependant, si vous tapez
CURSET 120,50,1
CURSET 123,50,1
FILL 10,1,17
vous constaterez que la commande FILL n'affecte l'écran
qu'à partir de la première position du curseur. Cette
remarque nous permet d'introduire le rôle du paramètre B.
Il faut considérer que, sur une ligne, il y a 240
points (ou pixels) rangés par blocs de 6 ; il y a donc 40
de ces blocs. La commande FILL n'agit pas sur un pixel
isolé ; en fait elle exerce son action par blocs de 6
pixels.
Pour cela, si vous positionnez votre curseur au
hasard sur l'écran, l'ordre FILL agira à partir de la
coordonnée horizontale, multiple de 6, qui précède la
position réelle du curseur. C'est ce que vous a montré le
dernier exemple proposé.
Pour confirmation, tapez :
10 HIRES
20 CURSET 120,100, 1
30 FOR N = 1 TO 25 STEP 1
40 FILL 1,1,18
50 CURSET 120-N, 100+N, 1
60 NEXT N
Ainsi, au lieu d'apparaître sur une oblique, l'impression
des couleurs va être disposée en escalier. Nous verrons
tout à l'heure comment obtenir une oblique.
Tapez : HIRES
FILL 10,1,63
FILL 10,2,63
FILL 10,5,63
Vous voyez apparaître, suivant l'ordre FILL considéré, 1,
2 ou 5 blocs (occupant 6 pixels en largeur). C'est bien
sûr le paramètre B qui sert à changer le nombre de ces
blocs.
- 121
Cependant, pour les couleurs, B ne joue aucun rôle.
HIRES
FILL 10,2,22
FILL 10,15,19
Toute la ligne se colore à partir du curseur.
Les deux premiers paramètres ont donc été présentés.
Attention à ne pas choisir A trop grand (vous sortiriez
de l'écran), et à 1e pas prendre non plus des valeurs de
B trop importantes : si vous êtes à l'extrême gauche de
l'écran, B peut valoir au maximum 40 (il y a 240 = 6x40
pixels sur une ligne).
Passons maintenant au dernier paramètre : X.
Pour O0 £X $<127, vous obtiendrez toute la gamme de
possibilités mise à votre disposition par la commande
FILL.
Entre 128 et 255 vous retrouverez les mêmes possibi-
lités. Nous n'aurons besoin que de X <127 pour ce para-
graphe. En effet Oric, par la commande FILL, ne tient
compte que des 6 premiers chiffres de X (en représenta-
tion binaire). Or de 128 à 255, il faut 7 bits (Ooul)
pour représenter X en binaire.
Entre O0 et 31,X est un attribut.
De O0 à 7, il contrôle la couleur de l'encre
HIRES
CURSET 120,100,1
CIRCLE 95,1
FILL 95,1,1
Vous voyez alors un quart du cercle devenir rouge.
De 8 à 15, X permet de passer aux caractères de forme
alternée (s'il y a des caractères sur l'écran en partie
haute résolution), ou bien de faire clignoter, ou encore
d'imprimer les caractères en les doublant sur une verti-
cale. Par exemple X = 12 fait clignoter.
— 122 -
Tapez : HIRES
CURSET 120,100,0
CIRCLE 95,1
CURSET 0,0,0
FILL 198,1,12
De 16 à 23, X contrôle la couleur du papier :
HIRES
FILL 10,1,21
De 24 à 31, X dérègle la synchronisation du balayage
de l'écran. Vous retrouverez l'action des attributs en
annexe.
Si X >32, X n'est plus un attribut, il devient un
modèle (PATTERN) et ce jusqu'à 127.
Tapez : HIRES
FILL 10,1,100
FILL 10,1,42
En binaire 100 s'écrit 1100100
42 s'écrit 0101010
FILL imprime les pixels correspondant aux L et non ceux
correspondant aux 0. Mais comme le travail s'effectue par
blocs de 6 pixels, seuls les 6 premiers bits à partir de
la droite composant le nombre seront pris en compte.
Ainsi pour 100, FILL lira 100100.
C'est précisément cette notion de modèle qui va nous
permettre d'obtenir la disposition en oblique des régions
affectées par la commande FILL.
HIRES
CURSET 120,100,1
FILL 1,1,65
FILL 1,1,67
FILL: 1, 1,71
FILL 1,1,79
FILL 1,1,95
FILL 1,1,127
puis CURSET 120,100,1
FILL 10,1,1
— 123 -
11 est impossible de passer en revue toutes les
caractéristiques offertes par cette commande, mais voici
un aperçu de quelques propriétés que vous complèterez,
par expérimentation, selon vos besoins.
Les commandes PAPER ou INK annulent l'action des
attributs contrôlant le papier ou l'encre.
HIRES
FILL 20,10,20
PAPER 4
Un FILL colorant le papier (16 XK<23) est effacé par
un ordre FILL ayant un paramètre X compris entre 0 et
127.
HIRES
CURSET 0,0, 1
FILL. 10, 1,22
CURSET 0,0,1
FILL 10,3,63
Pour X compris entre 32 et 127, vous obtenez des
blocs de pixels sur lesquels vous pouvez effectuer des
changements d'encre :
HIRES
FILL 10,5,100
INK 4 : PAPER 1
Vous constatez que le premier bloc ne change pas de
couleur, que le second disparaît et que c'est seulement à
partir du 3ème bloc que la couleur de l'encre change.
De plus le changement de couleur de papier supprime
le premier bloc. Maintenant si vous tapez
HIRES
CURSET 0,0,1
FILL 10,5,63
CURSET 0,0,1
FILL 10,1,22
Vous voyez que seul le premier bloc (issu de la première
commande FILL) se colore sous l'action d'un ordre FILL
comportant un attribut de couleur de papier. Les autres
blocs ne changent pas.
- 124 -
Voici un programme, montrant à la fois l'action des
divers paramètres X, qui concluera ce paragraphe sur la
commande FILL.
10 HIRES
20 FOR À = 1 TO 128
30 IF A>23 AND A < 32 THEN60
40 CURSET RND(1)*100+1,RDN(1)*100 +1,1
50 FILL RND(1)%60+1,1,A
60 NEXT A
Cela vous montre d'ailleurs, qu'il n'est pas nécessaire
de fournir des paramètres entiers. CURSET, comm FILL,
travailleront avec la partie entière.
A vous maintenant d'entreprendre vos propres manipu-
lations pour maîtriser et comprendre l'action des diver-
ses commandes du mode HIRES.
Pour terminer cette partie sur les commandes, indi-
quons comment on peut obtenir certains effets spéciaux en
mode LORES ou TEXT. -
Par exemple, on peut faire imprimer les caractères en
double hauteur. Faites [CTRL] [D]. Tout ce que vous écri-
rez sera désormais doublé en hauteur. Pour annuler cet
effet, tapez [CTRL] [D]. Vous pouvez obtenir le même ef-
fet en tapant
PRINT CHR$(4)
Vous trouverez en annexe la liste des caractères de
contrôle et de leur action (nous venons de voir celle du
caractère de contrôle D) Vous pouvez également faire cli-
gnoter des caractères en utilisant le petit programme
suivant
5 INK 1
10 PRINT CHRS(12)
20 PRINT CHRS(27);"N BONJOUR"
30 PRINT CHR$(27);'"N BONJOUR"
La ligne 20 comporte l'instruction produisant le cligno-
tement. On retrouve l'expression CHR$(27) rencontrée dans
un paragraphe précédent. Cette fois elle est couplée à la
lettre N, comme l'indique la ligne 20.
La ligne 10 est équivalente à CLS ; elle est indispen-
sable pour la bonne exécution du programme. Vérifiez-le
en la supprimant.
— 125 -
Nous avons
vait également
Tapez : l
2
5
10
20
30
déjà vu que par la commande PLOT on pou-
obtenir un clignotement.
CLS
TEXT
FOR N=1 TO 24
PRINT "TEXTE CLIGNOTANT"
NEXT N
PLOT 5,12,12
Voici un programme qui va faire intervenir quelques-
unes des commandes étudiées précédemment et qui va clore
en le résumant
consacrée aux c
10
20
270
500
510
520
par un dessin, cette partie du chapitre
ommandes.
HIRES
X=40
CURSET 80,100 ,3
PAPER 6 : INK 1
STP =2*PI/40
F = 0
REPEAT
DRAW X#*COS(F),-X*SIN(F), 1
DRAW -X*SIN(F),-X*XCOS(F),1
DRAW -X#COS(F),X*SIN(F), 1
DRAW X*SIN(F),X*COS(F), 1
F=F+STP
X = Xx-1
UNTIL F >2*PI
CURSET 120,80,1
REPEAT
READ A,B
DRAW A,B,1
UNTIL B=0
CURSET 170,40,3
DRAW 10,-10,1
CURSET 160,20 ,3
FOR N=1 TO 10
READ L
CHAR L,0,1
CURMOV 7,0,3
NEXT N
DATA 50,10,-20,-20,-100,-20,60
DATA -40,20,10,70,10,-20,0
DATA 69,78,32,65,86,65,78,84,32,33
— 126 -
GRAPHIQUES AVANCES
Si vous vous reportez à l'annexe G décrivant la carte
mémoire d'Oric, vous vous apercevrez que les caractères
standard ou alternés sont stockés dans la mémoire vive
(ou RAM) d'Oric. On peut donc accéder à l'endroit de la
mémoire où sont rangés ces caractères.
En fait toutes les informations servant à définir un
caractère sont rangées par octet (groupe de 8 bits 0 ou
1). Il faut 8 octets pour décrire le caractère. À chacun
de ces octets correspond un nombre, qui est l'adresse de
l'octet et qui permet de le repérer dans la mémoire.
Un caractère occupera donc 8 adresses dans la mémoi-
re. L'ensemble des adresses est compris entre les nombres
46080 et 47104, soit 1024 adresses, ce qui correspond
bien à 128 caractères 128 x 8 = 1024.
Les 8 octets définissant un même caractère ont des
adresses successives. Ainsi À est contenu dans les octets
ayant les adresses :
46600 00001000 )
46601 00010100 )
46602 00100010)
46603 00100010) 8 octets définissant A
46604 00111110 )
46605 00100010)
46606 00100010 )
46607 00000000 )
adresses
Vous voyez que la disposition des 1 parmi les 0 forme
l'image d'un A. A l'impression, Oric fera correspondre
les 1 à de l'encre et les O0 à du blanc.
Les caractères sont rangés dans l'ordre de leur code
ASCII. Ainsi le caractère @ dont le code ASCII est 64
est stocké entre les adresses 46080 + (64 * 8) et 46599 =
46080 + (64 * 8) + 7. A, dont le code ASCII est 65, est
stocké aux adresses suivant 46599, soit de 46600 à 46607
(ou de 46080 + (65 * 8) à 46080 + (65 * 8) +7).
- 127 -
Nous allons maintenant prendre connaissance de deux
commandes, qui permettent pour la première, de voir ce
qu'il y a en mémoire à telle ou telle adresse, et pour la
seconde de modifier ce qu'il y a en mémoire.
À l'adresse 46600 est rangé le premier octet définis-
sant le caractère À ; il vaut en binaire 00001000, soit 8
en décimal. C'est pourquoi, si vous tapez PRINT PEEK
(46600), vous obtiendrez : 8.
PEEK, suivi du nombre adresse de l'octet, vous four-
nit donc le contenu de cet octet (en décimal), et peut
donc vous permettre de savoir quels sont les octets
stockés à n'importe quelle adresse.
POKE vous permet de modifier l'octet rangé à une cer-
taine adresse K.
Si vous tapez POKE 46600,15 vous vous apercevrez que
vous avez modifié la forme géométrique du caractère A, en
modifiant la valeur d'un octet définissant ce caractère.
46600 : 00001000 est devenu
46600 : 00001111
et la variation géométrique de A correspond à la varia-
tion de la disposition des 1 dans l'octet 46600.
Vous avez donc maintenant la possibilité de trans-
former tous les caractères à votre guise. Si vous avez de
la patience et du talent vous pourrez même obtenir un
alphabet gothique ou russe. Et si la fantaisie vous en
prend, vous pouvez même supprimer tous les caractères en
tapant POKE K,0 pour K allant de 46080 à 47104.
Précisons, cependant, qu'après POKE la valeur décima-
le de l'octet que vous introduisez doit être comprise
entre 0 et 63, ce qui correspond en binaire aux nombres
de 6 bits au plus (de O0 à 111111).
En effet, pour tous les caractères, seuls les six
derniers bits de chaque octet définissant le caractère,
contiennent les informations géométriques servant à
dessiner ce caractère.
— 128 -
Voici maintenant un programme qui va vous être très
utile pour redéfinir le caractère de votre choix comme
vous le désirez.
l
10
20
30
40
50
60
70
90
REM *** MODIFICATIONS DE CARACTERES ***
CLS
DIM X(8):DIM Y(8,8):DIM L(8)
PRINT "ENTREZ LE CARACTERE QUE”,
"VOUS SOUHAITEZ MODIFIER"
GET A$
PRINT A$
C = ASC (AS)
A = 46080 : D = C * 8
GOSUB 1000
100 PRINT “ENTREZ HUIT NOMBRES"
110 PRINT “(UN PAR LIGNE)"
120 PRINT “COMPOSES CHACUN DE"
122 PRINT "SIX ZEROS OU UNS"
130 FOR N = O TO 7
150 INPUT X(N)
160 FOR P = 6 TO 1 STEP -1
170 LA = INT(X(N)/(10T(P-1)))
180 X(N) = X(N)-(10T(P-1)) * LA
190 L(N) = L(N)+LA*(2T(P-1))
200 NEXT P
210 X(N) = L(N)
220 POKE(A+D+N),X(N)
230 NEXT N
240 GOSUB 1000
250 STOP
1000 REM *** SUB.MODIF.CARAC. ***
1010 FOR N = O TO 7
1020 X(N) = PEEK (A+D+N)
1030 FOR M = O TO 7
1040 Y(N,M) = INT(X(N)/27(7-M))
1050 Z = ((X(N)Î2 (7-M))-Y(N,M))*21(7-M)
1060 X(N) = Z+0.0001
1080 IFY(N,M)= O THEN POKE 48220+(N*40)+M, 32
1090 IFY(N,M)= 1 THEN POKE 48220+(N*40 )M,128
1100 NEXT M
1110 NEXT N
1120 RETURN
Commentaires :
Le tableau à deux dimensions : Y(8,8) va stocker un
caractère (sous forme de 8 octets).
— 129 -
Le tableau à une dimension X(8) va décrire successi-
vement chaque octet.
On demande tout d'abord de rentrer un caractère
(celui que vous souhaitez modifier). On cherche alors
l'adresse mémoire de ce caractère grâce à son code ASCII.
Vous introduisez ensuite 8 nombres binaires repré-
sentant (écrits les uns au dessus des autres) par la
disposition des l1, la nouvelle géométrie du caractère.
Ces nombres binaires seront alors traduits en déci-
mal, avant d'aller modifier (par POKE) les anciens oc-
tets.
Les lignes 1080 et 1090 font afficher le nouveau
caractère (à grande échelle) sur l'écran.
32 (caractère blanc) correspondant ici
0
et 128 (bloc plein) correspondant ici 1
à
|
à
Mais les adresses mémoire ne concernent pas unique-
ment les caractères. Elles concernent aussi les adresses
liées à l'écran ; chaque région de l'écran correspond à
une adresse mémoire.
Si vous vous reportez à la carte mémoire d'Oric, vous
trouverez les adresses mémoires concernant les lieux géo-
métriques de l'écran, en mode TEXT et en mode HIRES. Il y
en a beaucoup plus en mode HIRES, parce que la résolution
est plus fine dans ce mode et que l'on a besoin de davan-
tage d'adresses pour se repérer.
Nous allons utiliser ces adresses tout-à-l'heure.
Auparavant, il est nécessaire de reparler des attri-
buts que nous avons déjà rencontrés pour les commandes
PLOT (en mode TEXT ou LORES) et FILL (en mode HIRES).
Ces attributs, dont le rôle est défini en annexe,
sont toujours compris entre O0 et 31 et ont les mêms
actions, utilisés avec la commande POKE, ou avec les
commandes PLOT et FILL.
Tapez par exemple
— 130 -
10 FOR N + 1 TO 24
20 PRINT "TEXTE POUR REMPLIR L'ECRAN"
30 NEXT N
50 POKE 48162,12
Vous voyez alors une ligne clignoter. 48162 est une
adresse mémoire correspondant au lieu de l'écran où le
clignotement apparaît, et 12 est l'attribut qui provoque
le clignotement.
Dans le programme ci-dessus, vous pouvez changer cet
attribut et vérifier que son action, lorsqu'il varie de 0
à 31, concorde avec celle décrite par les annexes.
Si dans la ligne 50 vous changez 48162 en 48200, vous
constaterez que l'action de l'attribut se décale d'une
ligne vers le bas.
En effet, en mode TEXT ou LORES, il y a 40 cellules
par ligne et à chacune d'elle correspond une adresse.
Pour changer de ligne il faut donc ajouter 40 à l'adresse
mémoire.
adresse J
—+ ligne I
+ ligne I +1
adresse
J + 40
De même, en mode HIRES, nous avons vu avec FILL que
les pixels (les points) n'étaient pas pris en compte
individuellement, mais qu'Oric les considérait groupés
par bloc de six.
Comme il y a 240 pixels par ligne, il y a 40 de ces
blocs, et à chacun de ces blocs correspondra une adresse
mémoire.
Il y a donc, en mode HIRES, comme en mode LORES ou
TEXT, 40 adresses mémoire par ligne.
Tapez : HIRES
POKE 41000,21
POKE 41040, 22
“131 :=
Mais les attributs ne constituent pas les seuls para-
mêtres pouvant être placés après l'ordre POKE.
En fait, un octet, de par la façon dont les 0 ou les
1 qui le composent sont disposés, conditionne la manière
de faire imprimer un caractère ou afficher une couleur
sur l'écran.
Suivant la forme binaire de ces octets, on a affaire
à un attribut ou à un modèle (PATTERN) qui peut servir,
4
comme on l'a vu, à construire des traits interrompus.
bit 7 | bit 6 | bit 5 se 4 Joue à | 2 se 2] 0
Si les bits 5 et 6 sont tous les deux égaux à O0,
alors l'octet sera lu comme un attribut.
La valeur de cet attribut est donnée par les cinq
derniers bits (4 à O0), c'est-à-dire qu'en binaire, les
attributs sont compris entre 00000 et 11111, soit en
décimal entre 0 et 31.
Si par contre l'un des deux bits (5 ou 6) n'est pas
nul, l'octet sera lu comme un modèle : le nombre modèle
ayant pour valeur les six derniers bits (5 à 0) soit en
décimal les valeurs 32 à 63.
Ce sont ces nombres modèle que nous avons utilisés
pour construire des traits interrompus avec DRAW, ou des-
siner des blocs grâce à FILL. Nous avions utilisé des
modèles supérieurs à 63, mais en fait ces nombres supé-
rieurs à 63 ont plus de 6 chiffres en représentation
binaire.
Pour FILL, par exemple, seuls comptaient les six pre-
miers O ou 1 du nombre (en binaire). Et avec six O ou 1,
on ne peut dépasser 63.
Les sept premiers bits permettent de construire des
nombres binaires allant jusqu'à 127, soit 01111111 en
binaire.
Le bit 7 est resté égal à O0 jusque là. Si on le prend
= 132:-
égal à l, on passe alors à des nombres supérieurs à 127,
allant jusqu'à 255. Le bit 7 égal à 1 va produire une
inversion des caractères, comme vous allez le voir
maintenant.
Les petits programmes suivants vont nous montrer
quelle est l'action des divers octets après l'ordre POKE,
qu'ils soient considérés comme attributs ou non.
10 FOR N = 1 TO 24
20 PRINT "TEXTE POUR REMPLIR L'ECRAN"
30 NEXT N
40 FOR X = O TO 31
50 POKE 48202,X
55 WAIT 25
60 NEXT X
Attention, les attributs 24 à 31 dérèglent la syn-
chronisation de l'écran.
Passez maintenant aux octets suivants, en remplaçant la
ligne 40 par :
FOR X = 32 TO 127
puis faites exécuter à nouveau le programme.
Enfin remplaçons, pour terminer la démonstration, la
ligne 40 par :
FOR X = 128 TO 255
Par POKE, vous pouvez affecter un attribut à un
endroit particulier de l'écran.
Il exerce alors son action sur toutes les cellules
situées à sa droite. Et une cellule est affectée par
l'attribut situé à sa gauche : c'est le premier attribut
rencontré à sa gauche qui prédomine.
Que ce soit en mode TEXT ou HIRES, vous devez donc
placer l'attribut à la gauche de la cellule dont vous
voulez modifier la couleur de l'encre, du papier, ou dont
vous voulez faire clignoter le caractère qui s'y trouve.
— 133 -
Tapez : HIRES
POKE 48039,1
POKE 48040,64
POKE 48039,12
Le programme suivant vous montre une utilisation de
POKE pour séparer l'écran en deux : une zone choisie par
avance peut avoir une couleur d'encre fixe et bien déter-
minée, alors que l'autre zone peut avoir une couleur
d'encre variable.
On choisit des attributs de couleur d'encre au hasard
qu'on place par POKE aux adresses 40960 + K*40, K allant
de O0 à 200. Ces adresses correspondent à l'extrême gauche
de toutes les lignes disponibles en haute résolution.
Pour chacune de ces adresses, on place un attribut de
couleur d'encre bien déterminé l'adresse en question
augmentée de 100, c'est-à-dire la moitié de l'écran,
deux lignes plus bas.
à
«
à
adresse
adresse + 40
adresse + 80
adresse + 100
gauche de droite de
l'écran l'écran
1 HIRES
10 FOR X = 40960 TO 49079 STEP 40
30 POKE X, INT (RND(2)*7+1)
40 POKE X + 100,2
50 NEXT X
60 CURSET 120,100,0
70 FOR N = 96 TO 1 STEP -5
80 CIRCLE N,1
90 NEXT N
- 134 -
CHAPITRE D
Les sons
et l'oric
5.1 INTRODUCTION
Votre Oric contient quelques commandes sonores parti-
culièrement sophistiquées utilisant un circuit spécial
qui peut synthétiser trois sons différents, qu'ils soient
purs ou mélangés à un bruit.
Vous avez déjà fait l'expérience de quelques-uns des
sons disponibles sur Oric. Chaque fois que vous pressez
une touche, Oric produit un bip sonore aigu. Si vous
pressez sur [RETURN] ou n'importe quelle touche de con-
trôle, vous entendrez un bip plus grave. Si vous voulez
supprimer les sons produits par les touches du clavier,
il vous suffit d'appuyer en même temps sur les touches
[CTRL] et [F]. Ces sons seront restitués si vous appuyez
à nouveau simultanément sur [CTRL] et [F].
Oric offre des sons prédéfinis pour les jeux (guerre
de l'espace...). Il permet aussi de simuler un modèle
réduit de clavier de piano, etc... Etudions maintenant
toutes ses possibilités sonores.
— 135 -
5.2 LES SONS PREDEFINIS
Quatre sons sont préenregistrés. Il s'agit de ZAP,
PING, SHOOT et EXPLODE, lesquels peuvent être obtenus
très facilement. Ecrivez ZAP sur le clavier, puis appuyez
sur la touche [RETURN], vous entendrez une décharge sif-
flante qui reproduit le son d'un pistolet galactique à
laser. Maintenant, entrez de la même façon PING, vous
obtiendrez une sonnerie qui peut d'ailleurs être directe-
ment produite en appuyant à la fois sur [CTRL] et [G].
SHOOT, quant à elle, est une commande simulant le tir
d'un pistolet terrien à poudre. Enfin EXPLODE produit...
une explosion.
Ces quatre sons prédéfinis vous seront très utiles
pour le bruitage des jeux d'action que vous programmerez.
Ils peuvent être inclus dans des programmes comme n'im-
porte quelle autre commande basic.
Par exemple :
10 FOR N = 1 TO 10
20 ZAP
30 WAIT 5
40 NEXT N
produira une salve de ZAP, imitant une mitrailleuse ga-
lactique.
Vous pouvez remarquer qu'à la ligne 30, on a intro-
duit une pause grâce à l'instruction WAIT 5. Ceci permet
au son de finir avant qu'un autre ZAP ne débute. La durée
du silence à mettre dépend en fait de celle du son. Un
temps de pause inférieur à la durée d'exécution du son
n'a aucun effet et le son produit sera continu.
Mais passons aux principales commandes de son.
5.3 LES COMMANDES DE SON
Les commandes de son sont au nombre de trois. Il s'a-
git de SOUND, MUSIC et PLAY. Les deux premières servent à
définir la nature du son (son pur ou mélangé à un bruit)
et sa hauteur, tandis que la troisième contrôle l'exécu-
tion sonore (timbre, durée d'exécution, volume).
— 136 -
Ces commandes nécessiteront un certain temps avant de
vous devenir familières, mais elles vous donneront la
possibilité de composer de la musique comme sur n'importe
quel instrument existant. De plus, du bruit peut être
ajouté pour imiter le son des bombes, des avions... etc.
Vous verrez que les possibilités de sonorisation ne sont
en fait limitées que par votre imagination et ne sont pas
aussi compliquées qu'elles peuvent apparaître à première
vue.
Mais avant de passer au détail des commandes de son,
je vous propose ce petit programme de musique aléatoire
qui vous donnera une idée des sons que l'on peut obtenir
sur Oric. Pour arrêter son exécution, il vous suffira
d'appuyer simultanément sur les touches [CTRL] et [C].
5 REM ** MUSIQUE ALEATOIRE **
10 MUSIC 1, RND(1) * 6, RND(1) * 12 + 1, 7 +
RND(1) * 8
20 WAIT RND(1) * 20 + 5
30 GOTO 10
Pour comprendre l'exécution de ce programme, il vous
suffit de vous reporter aux explications concernant la
commande MUSIC.
Mais examinons maintenant le détail des trois comman-
des sonores SOUND, MUSIC et PLAY.
5.3.1 SOUND (canal, période, volume)
Cette commande vous permet d'obtenir un son dont vous
fixerez la période et le volume et qui sera exécuté tel
quel ou bien mélangé à un bruit suivant le canal choisi.
La commande comporte trois paramètres qui doivent être
numériques (sinon la commande ne pourra être exécutée).
Regardons-les en détail :
— LE CANAL
Ce paramètre peut prendre 6 valeurs, de 1 à 6. Si
vous choisissez une des trois premières valeurs : 1, 2 ou
3, le son qui sera produit sera un son pur, défini par
les paramètres période et volume qui suivent.
— 137 -
Si vous choisissez pour canal la valeur 4, 5 ou 6, vous
produirez à l'exécution sonore, le son pur auquel
s'ajoutera un bruit, toujours le même. L'avantage de
disposer de 3 canaux de sons purs ou de sons mélangés à
un bruit, est de pouvoir ainsi définir simultanément
plusieurs sons (trois au plus) qui pourront être
synthétisés par la commande PLAY, que nous verrons
ultérieurement.
— LA PERIODE
Ce paramètre mesure la période de vibration de la no-
te et commande de fait la hauteur du son produit. Plus la
période est faible, plus la note est aiguë ; plus la pé-
riode est élevée, plus la note est grave.
— LE VOLUME
Ce paramètre mesure évidemment l'intensité sonore à
l'exécution. Il peut prendre 15 valeurs de 1 à 15, le vo-
lume 1 désignant l'intensité la plus faible. A moins que
vous n'utilisiez un amplificateur Hi-Fi externe, vous
trouverez probablement que les volumes 6 et 7 sont ample-
ment suffisants.
REMARQUE : Vous pouvez mettre le volume à la
valeur zéro. A ce moment-là l'exécution sonore du
son, défini par sa période et rangé dans un canal
déterminé, sera assurée par la commande PLAY suivante
à condition que celle-ci renvoie au canal où a été
placé le son.
En pratiquant les commandes sonores d'Oric, vous vous
rendrez compte qu'il est plus commode d'utiliser SOUND
seulement pour définir le son et de le faire exécuter
ensuite par PLAY. Il en découle que le volume dans SOUND
sera souvent mis à 0.
5.3.2 MUSIC (canal, octave, note, volume)
La commande MUSIC diffère de SOUND par le fait qu'au
lieu de définir un son par sa période de vibration, elle
définit une note de musique par le nom qu'elle porte et
l'octave où elle se trouve. La commande MUSIC vous permet
— 138 -
donc de créer des sons purs d'une hauteur déterminée,
correspondant tout simplement aux notes de la gamme.
— LE PARAMETRE CANAL ne peut prendre que les valeurs 1, 2
ou 3 qui produisent des sons purs. La commande MUSIC ne
peut pas mélanger une note à un bruit !
— LE PARAMETRE OCTAVE peut prendre 8 valeurs de 0 à 7, la
valeur O0 donnant l'octave le plus grave. Ce nombre d'oc-
taves permet de couvrir largement le clavier classique
d'un piano.
— LE PARAMETRE NOTE peut prendre 12 valeurs de 1 à 12, et
la correspondance avec les notes de la gamme est la sui-
vante :
do
do # ou ré b
ré
ré # ou mi b
mi
fa
fa # ou sol b
: sol
: sol# ou la b
10 : la
11 : la # ou si b
12 : si
. 0e °° ee
© © JO Uni & Y D H
soit encore, en reproduisant le clavier du piano :
è 4 7 9 411
— 139 -
— LE PARAMETRE VOLUME varie comme pour SOUND de 1 à 15.
La mise à zéro du volum entraîne, comme pour SOUND,
l'exécution de la note par une commande PLAY qui vient
après.
Pour essayer cette commande MUSIC, je vous propose de
monter les notes de la troisième octave. Ce programme
vous permettra d'utiliser votre Oric comme un instrument
à clavier puisque, enfoncées, les douze premières touches
de la ligne supérieure de votre clavier produiront les
notes correspondantes. Les neuf premières touches mar-
quées de 1 à 9 produiront les notes de do à sol , de 1/2
ton en 1/2 ton, et les trois touches suivantes (“0", “-"
et “"=") compléteront la gamme jusqu'à si.
En appuyant sur “/", vous interromprez le programme.
5 REM ** ESSAI DU CLAVIER **
10 PLAY 0, O0, O0, O
20 GET A$
30 A = VAL(AS)
4O IF A$ = “-" THEN A = 11
50 IF A$ = "=" THEN A = 12
60 IF A$ = “/" THEN PLAY 0, O, O0, O : STOP
70 IF A$ = “O" THEN À = 10
80 MUSIC 1, 3, À, 10
90 WAIT 10
100 GOTO 10
Ce programme appelle quelques commentaires. La ligne
20 attend une saisie au clavier, la ligne 30 lit la va-
leur entrée et l'introduit dans la variable A. Si vous
avez entré un chiffre (1 à 9), A aura la valeur de ce
chiffre ; si vous avez entré autre chose, alors À est mis
automatiquement à zéro. Les lignes 40 à 60 convertissent
les touches aux valeurs requises. La ligne 70 rejette la
valeur zéro pour A car MUSIC ne peut l'accepter. La ligne
90 commande la durée d'exécution du son puisqu'elle fait
attendre 100 ms l'exécution du programme, durant lesquel-
les la note définie par MUSIC est exécutée. Au bout de
ces 100 ms, on passe à l'instruction suivante PLAY O0, O0,
0, O qui arrête l'exécution sonore. Si elle n'y était
pas, la note aurait continué à jouer jusqu'à ce que vous
ayez appuyé sur une nouvelle touche.
Retenez cette instruction PLAY 0, O0, 0, O qui sert
souvent.
- 140 -
Ce petit programme vous montre que l'exécution d'un
son en utilisant seulement MUSIC nécessite les instruc-
tions WAIT et PLAY 0,0,0,0.
Cela aurait été la même chose avec SOUND. Pour faci-
liter l'exécution de sons quelconques ou de notes, on
utilise donc plutôt la commande PLAY.
5.3.3 PLAY (combinaison des canaux de son pur, combinai-
son des canaux avec bruit, mode de sortie sonore,
période)
Avant de passer au détail des paramètres de cette
commande, rappelons qu'avant PLAY ont dû être définis par
SOUND ou MUSIC des sons ou des notes rangés dans des
canaux et dont le paramètre volume a été mis à zéro.
— LE PARAMETRE COMBINAISON DES CANAUX DE SON PUR va com-
biner entre eux les canaux de sons purs où se trouvent
des notes ou sons purs. Il peut prendre huit valeurs de O
à 7 dont la signification est la suivante :
0 : aucun canal de son pur n'est branché en
sortie
1 : le canal 1 est branché en sortie
223 le canal 2 est branché en sortie
3.5 les canaux 1 et 2 sont branchés en sortie
& : le canal 3 est branché en sortie
5 : les canaux 3 et 1 sont branchés en sortie
6 : les canaux 3 et 2 sont branchés en sortie
173 les canaux 1, 2 et 3 sont branchés en sortie
— LE PARAMETRE DE COMBINAISON DES CANAUX AVEC BRUIT va
combiner entre eux les canaux 4,
des sons mélangés à un bruit.
5 et 6 qui contiennent
Les valeurs de ce paramètre sont similaires au para-
mêtre de combinaison des canaux purs.
0 : aucun canal de son mélangé n'est branché en
sortie
1 : le canal 4 est branché en sortie
2 : le canal 5 est branché en sortie
3 : les canaux 4 et 5 sont branchés en sortie
- 141 -
le canal 6 est branché en sortie
les canaux 6 et 4 sont branchés en sortie
les canaux 6 et 5 sont branchés en sortie
les canaux 4, 5 et 6 sont branchés en sortie
SOU
— LE MODE DE SORTIE
Le troisième paramètre de PLAY va définir le mode de
sortie sonore. Sept modes de sorties numérotées de 1 à 7
sont disponibles. Il peuvent être schématisés comme suit.
L':
he
2 : D]
RINNRN
C SR A
CRE RE HSE
s CAAMAA
7—
Ce paramètre permet de créer des sons légèrement mon-
tants ou descendants, continus ou oscillants. Ces carac-
tères sont plus ou moins marqués suivant la valeur prise
par le quatrième et dernier paramètre de PLAY.
— LA DUREE DU SON
Le quatrième paramètre de PLAY est un chiffre allant
de O0 à 32767. Ce chiffre contrôle la durée du son de la
façon suivante. Si le mode de sortie n'est pas périodique
(modes de sortie 1, 2, 5, 7), il mesure simplement la
durée du son et plus cette durée est grande, plus le ca-
ractère montant ou descendant du mode de sortie en ques-
tion sera accusé. Par contre, si le mode de sortie est
périodique (modes 3, 4, 6), le paramètre mesure alors la
période du mode de sortie (à ne pas confondre avec la pé-
riode propre du son, liée à sa hauteur). Dans ces cas de
sorties, plus le paramètre est élevé, plus la période est
étalée et plus les variations sonores s'entendent bien.
— 142 -
En fait ces modes de sortie vous deviendront d'autant
plus familiers que vous les pratiquerez. Pour commencer
votre apprentissage, je vous propose ce petit programme
qui vous permet de manipuler les paramètres mode de sor-
tie et période sur la note la :
5 REM ** ESSAIS DE SORTIE DU LA **
10 INPUT “ENTREZ LE MODE DE SORTIE DE 1 à 7"; M
20 IF M < 100R M > 7 THEN 10
30 INPUT “ENTREZ LA PERIODE DE O A 32767"; P
40 IF P < O OR P = 32767 THEN 30
50 MUSIC 1, 3, 10, O
60 PLAY 1, 0, M, P
70 PRINT “APPUYEZ SUR RETURN SI LE SON CONTINUE"
80 GOTO 10
Vous interromprez ce programme en appuyant sur [CTRL]
et [C].
L'intérêt de la commande PLAY tient dans ces possibi-
lités de sortie mais surtout dans le fait qu'elle peut
synthétiser jusqu'à 3 sons purs et 3 sons mélangés à un
bruit.
Ainsi : 10 MUSIC 1, 3, 1, 10
20 MUSIC 2, 3, 5, 10
30 MUSIC 3, 3, 8, 10
40 PLAY 7, O, 1, 500
50 WAIT 600
60 PLAY 0, 0, O0, O
produit l'accord do, mi, sol.
Pour terminer ce chapitre, voici une petite mélodie
qui vous montrera une façon de rentrer les notes et leur
durées grâce aux instructions DATA :
10 REM ** MELODIE **
20 FOR N = 1 TO 11
30 READ À, B
40 MUSIC 2, 3, À, O
50 PLAY 3, O0, 7, 2000
60 WAIT B
70 PLAY 0, 0, 0, O
80 NEXT N
90 DATA 5, 30, 5, 30, 7, 30, 8, 75, 5, 75, 8, 60
100 DATA 10, 30, 7, 60, 5, 30, 3, 30, 5, 180
- 143 -
A)
B)
c)
D)
E)
F)
G)
H)
ANNEXES
Récapitulation des fonctions et commandes
au Basic
Les messages d'erreur
Utilisation d'une cassette
Utilisation d'une imprimante
Numérotation hexadécimale, représentation
des nombres
Tableau des codes ASCII
Carte mémoire d'Oric
Rôle des attributs
- 144 -
p 145
p 171
p 178
pl8l
p 183
p 187
p 188
p 189
Annexe À : RECAPITULATIF DES FONCTIONS ET
DES COMMANDES DU BASIC DE L'ORIC
Rappelons, avant de commencer, ce qui distingue une
fonction d'une commande.
Une commande est constituée d'un mot-clé éventuelle-
ment suivi par un ou plusieurs paramètres séparés par des
virgules, tandis qu'une fonction est constituée d'un mot-
clé qui est le nom de la fonction, obligatoirement suivi
par une ou plusieurs variables appelées arguments de la
fonction, séparés par des virgules et placés entre paren-
thèses. Une commande va exécuter une chose bien précise
en fonction des valeurs des paramètres données.
Par exemple tapez :
N=1
PAPER N
Cela crée un fond rouge pour l'écran. PAPER est le
nom de la commande et N son paramètre, qui vaut ici 1.
a
Une commande qui est employée à l'intérieur d'un
programme prend le nom d'instruction du programme.
- 145 -
Une fonction, elle, va calculer une grandeur à partir
des valeurs de ses variables au moment où elle est appe-
lée. Une fonction peut être considérée comme une commande
n'exécutant que des calculs.
Par exemple, la fonction racine carrée sera définie
par SQR(X) (SQR est l'abréviation de square root : racine
carrée). SQR est le mot-clé désignant la fonction racine
carrée, X est l'argument de cette fonction, c'est-à-dire
dans notre exemple, une variable numérique dont la valeur
doit être positive, car SQR(X) est définie par SQR(X) *
SQR(X) = X qui ne peut jamais être négatif car le produit
d'un nombre par lui-même, i.e. son carré, est toujours
positif.
L'utilité d'une fonction est de calculer des valeurs
et d'assigner ces valeurs à des variables dans un pro-
gramme. Prenons l'exemple suivant :
CE
10 A = SQR(X)
15 ?A
Notez que ?A signifie PRINT À et que ce programme
produit V2 = 1,414...
Le nom de la variable aurait pu être Y au lieu de X,
cela n'aurait rien changé. Ce qui compte, c'est de
fournir à cette variable une valeur satisfaisante. En
l'occurence un nombre (et non pas une chaîne de carac-
tères, par exemple) obligatoirement positif. Par contre,
le nom de la fonction, c'est-à-dire les trois lettres de
SQR, doit être scrupuleusement respecté.
Pour chacune des fonctions et commandes que nous
allons maintenant récapituler, nous allons donc vous
signaler leur signification pratique, la liste des argu-
ments ou des paramètres éventuels, la nature de ceux-ci
et leur domaine de définition, puis vous donner un exem-
ple illustrant la syntaxe d'emploi.
- 146 -
1) ABS(X)
Cette fonction fournit la valeur absolue de l'argu-
ment X qui peut être une variable numérique quelconque
comprise entre -1,7 10 et 1,7 10 . Si X est posi-
tif, ABS(X) est égal à X et si X est négatif, ABS(X) est
égal à -X. Dans tous les cas, ABS(X) retourne toujours
une valeur positive ou nulle.
Le petit programme suivant :
5 X = 4
10 Y = ABS(X)
15 Z = ABS(-4)
20 W= Y-Z
25 ?W
fournira la valeur nulle, car Y et Z valant tous deux 4,
leur différence W est nulle.
2) ASC(A$)
L'argument de cette fonction est obligatoirement une
chaîne de caractères, c'est pour s'en rappeler qu'il est
noté A$. Cette fonction ASC retourne la valeur du code
ASCII du premier caractère de cette chaîne de caractères
A$.
Rappelons que le code ASCII est un code de représen-
tation interne à Oric de chaque caractère alphanumérique
par un nombre binaire occupant la place d'un octet. La
fonction ASC va donc se contenter de décoder le ler octet
de la chaîne de caractère fournie et de donner sa valeur
décimale. La correspondance entre les valeurs décimales
de ces octets et ce qu'ils représentent est donnée dans
l'annexe F fournissant le code ASCII.
Prenons l'exemple d'utilisation suivant
5 A$ = "coucou"
10 PRINT ASC(AS$)
ou encore en mode direct ?ASC("coucou") donnera la valeur
en code ASCII de la lettre C, à savoir 67.
- 147 -
3) ATN(X)
Cette fonction est la fonction arctangente, dont l'ar-
8
gumgnt X est un nombre compris entre -1,7 10 et 1,7 *
10° . L'argument X de cette fonction représente la
tangente d'un angle dont ATN(X) représente justement la
valeur exprimée en radians et comprises entre -A/2 et/2
Pour mémoire, sur le cercle
trigonométrique de rayon OA
unité, la longueur du segment
AB représente la valeur de la
tangente de l'angle Ü . Si B
est au-dessus de A, la tangen-
te est positive et l'arc Ü a
une valeur comprise entre 0
(angle nul) et #1/2 (angle
droit). Si B est en-dessous de
A, Ô a une valeur comprise en-
tre -7/2 et O et la tangente
est négative.
4) CALL X
Cette commande, utilisée dans un programme, indique
que la suite du programme qui se trouve à l'adresse mé-
moire numérotée X est écrite en code machine. On revien-
dra au BASIC dès que l'on trouvera l'instruction RTS.
5) CHAR X, S, F, B
Cette commande ne peut être utilisée qu'en mode
HIRES. Elle consiste à dessiner un caractère à l'endroit
où se trouve le curseur ; plus précisément le sommet en
haut à gauche du caratère se trouvera à l'emplacement du
curseur. Les trois paramètres qui suivent CHAR sont les
suivants :
- X désigne le code ASCII du caractère à dessiner.
C'est donc un variable numérique comprise entre 32 et 128
(cf code ASCII en annexe F).
- $ est un paramètre pouvant prendre 2 valeurs : O ou
1.
- 148 -
La valeur O0 correspond au type courant d'impression
tandis que la valeur L produira l'autre type d'impression
type dit alterné, i.e. l'impression de formes géométri-
ques permettant le dessin stylisé.
. FB est un code d'impression qui peut prendre les 4
valeurs suivantes :
O':: l'impression est faite dans la couleur du
fond (numéro de PAPER) ; on ne voit donc rien
mais il y a eu impression.
1: l'impression est faite dans la couleur de
l'encre (numéro de INK).
2:32 inversion des couleur s.
3.3 aucune impression n'est faite.
Par exemple, après être passé en mode HIRES, vous
tapez
CHAR 67, O, 1
Cela produira la lettre C (codée par 67) en haut à gauche
de l'écran. Si vous aviez tapé 1 à la place de 0, vous
auriez eu Æ qui est le caractère de l'autre type d'im-
pression correspondant à C.
6) CHRS(X)
Cette fonction retourne le caractère dont le code
ASCII est X. L'argument X de cette fonction est un nombre
compris entre 32 et 128. Les fonctions ASC et CHR$ sont
inverses l'une de l'autre.
Pour vous en convaincre tapez
5 INPUT "CODE ASCII 32 A 128";Xx
10 A$ = CHRS(X)
15 B = ASC(AS$)
20 PRINT X,'"=",B
où CHR$ et ASC pris successivement ne produisent rien.
- 149 -
Pour X <31, PRINT CHR$(X) exerce une action particu-
lière qui est à rapprocher de l'action de la touche
[CTRL] enfoncée simultanément avec la Xième lettre de
l'alphabet. Ainsi, CHR$(4) provoque la même chose que
[CTRL] [D], à savoir l'écriture sur 2 lignes à la fois.
7) CIRCLE R,FB
Cette commande ne peut être utilisée qu'en mode
HIRES. Elle consiste à dessiner un cercle centré sur la
position du curseur dont le rayon R est une variable
numérique comprise entre 1l et 119. FB est le code
d'impression vu pour CHAR.
En mode HIRES, lancez par RUN le mini-programme :
5 CURSET 100,100, 1
10 CIRCLE 50,1
Il vous dessinera une cercle au milieu de l'écran. Vous
pourrez remarquer que la commande ne fonctionne pas si
une partie du cercle quitte l'écran.
8) CLEAR
Cette commande met toutes les variables à zéro et
vide les chaînes de caractères.
9) CLOAD "XX"
Commande de chargement d'un programme enregistré sur
cassette. Une fois lu, le programme précédent est perdu.
Exemple :
CLOAD"TARZAN "
10) CONT
Cette commande continue l'exécution d'un programme
après une interruption (opérée par [CTRL] et [C] ou par
STOP ).
— 150 -
Si durant l'interruption des modifications ont été appor-
tées (notamment correction d'instruction DIM), l'exécu-
tion du programme peut ne pas reprendre par CONT. Essayez
alors un GOTO numéroté, sinon relancez l'exécution au
début du programme.
11) COS(X)
Cette fonction est la fonction cosinus dont l'argu-
ment X est un nombre représentant la valeur exprimée en
radians de l'angle dont COS(X) est le cosinus.
Pour mémoire, sur le cercle
trigonométrique unité, OC
représente le cosinus de l'an-
gle 0 compris entre L et O0
tant que C reste entre A et O,
et compris entre 0 et -1 dès
que C passe entre O et A".
Exemple :
5 X = 1.5707963
10 ? COS(X)
donnera 0, car X vaut T/2.
12) CURMOV X,Y,FB
Cette commande place le curseur à une nouvelle posi-
tion définie par ses coordonnées X et Y relatives à
l'ancienne position. FB est le code d'impression vu pour
CHAR.
Cette commande ne peut être utilisée qu'en mode
HIRES.
13) CURSET X,Y,FB
Cette commande place le curseur à la position définie
par les coordonnées absolues X et Y, avec X compris entre
0 et 239, et Y compris entre 0 et 199.
FB est le code d'impression déjà vu pour CHAR.
— 151 -
14) CSAVE "XX"
Cette commande préserve le fichier portant le nom XX
pour l'enregistrer sur une cassette.
15) DATA
Cette instruction est suivie par une liste de cons-
tantes aussi bien numériques qu'alphanumériques et qui
sont stockées dans l'ordre d'écriture et seront lues dans
le même ordre par des instructions READ. Cette instruc-
tion ne peut être employée qu'en mode différé. Les cons-
tantes qui suivent doivent impérativement être séparées
par des virgules.
Exemple :
5 READ A,B,C,D$
10 DATA 1,2,3,"NOUS IRONS AU BOIS"
15 PRINT A,B,C,D$
16) DEEK (X)
Cette fonction retourne le contenu d'une octet plus
256 fois le contenu de l'octet suivant.
Exemple :
?DEEK(4062)
17) DEF FN
Cette instruction définit pour l'utilisateur une
fonction numérique à une variable en faisant suivre DEF
FN du nom de la fonction, de l'argument placé entre paren-
thèses, du signe égal suivi de l'expression analytique de
la fonction.
Exemple
10 DEF FNAA(X)=A*X+B
définit la fonction axtb.
— 152 -
18) DEF USR
Cette instruction permet de définir l'adresse en
mémoire du début d'un programme écrit en code machine.
Exemple :
DEF USR = #400
19) DIM
Cette instruction dimensionne tous les tableaux d'un
programme, qu'ils contiennent des nombres ou des caractè-
res alphanumériques. En pratique, cette instruction fixe
les valeurs entières maximales que peuvent prendre les
divers indices de tableaux. Le mot-clé DIM est suivi de
la liste des noms de tableaux et de leur(s) dimension(s),
chaque groupe étant obligatoirement séparé par des virgu-
les.
Notez qu'il est interdit de dimensionner deux fois le
même tableau à l'intérieur d'un programme mais un tableau
non-dimensionné est implicitement dimensionné à 10 1li-
gnes.
Exemple :
DIM A(5,10),B(4,2),C$(8)
ou encore : 10 INPUT N
20 DIM E(N,3)
20) DOKE X,V
Cette instruction range en mémoire la valeur V aux
adressses de mémoire X et X+1 de la façon suivante. La
partie entière de V/256 va à l'adresse X+1, et le reste à
l'adresse X.
21) DRAW X,Y,FB
En mode HIRES, cette commande dessine un segment de
droite dont l'origine est la position du curseur et l'ex-
trémité le point de coordonnée X,Y mesurées à partir de
l'origine du segment dessiné.
— 153 -
FB est toujours le code de représentation vu pour
CHAR.
22) END
Cette instruction termine un programme. Elle est
facultative si l'instruction END se trouve à la fin du
programme.
23) EXP(X)
Cette fonction calcule l'exponentielle de l'argument
» » X !
X, notée ggthémat iquement e *« L'argument X varie entre
-1,7 10 ebgl7 10 tandis que la fonction varie
de O0 à 1,7 10° .
?EXP (0)
donnera ll
24) EXPLODE
Cette commande produit un son prédéfini ressemblant à
une explosion.
25) FALSE
Cette instruction donne la valeur nulle au résultat
d'un test logique.
Par exemple le test logiqueA=(B=C) vaut 1 si B=C, et
vaut 0 si B est différent de C. Si l'on a écrit A=FALSE,
cela signifie que le test logique sera mis forcément à sa
valeur nulle.
26) FILL B,A,N
Cette commande n'est utilisable qu'en mode HIRES, et
a pour fonction de traiter graphiquement une partie de
l'écran :
. B désigne le nombre de lignes traitées (de O à 199) ;
- 154 -
. À désigne le nombre de blocs de six colonnes traités
(de 0 à 40) ;
. N est un paramètre de traitement graphique (de 0 à
127). De O à 31, N est un attribut et de 32 à 127 N est
un modèle (pattern).
Pour plus de détails, s'en rapporter au chapitre des
commandes graphiques élaborées.
27) FN
Ce mot-clé permet de manipuler le résultat d'une
fonction prédéfinie.
Exemple :
PRINT FNSA(3)
écrit la valeur de la fonction SA(3).
28) FOR...TO
STEP /NEXT
Cette instruction crée une boucle qui répète les
lignes du programme comprises entre FOR et NEXT. STEP
détermine la taille de l'incrément et est pris égal à 1
par omission.
Exemple :
10 FOR I = 1 TO 10 STEP 2
20 PRINT I
30 NEXT I
29) FRE(X)
Quelle que soit la valeur de l'argument, cette fonc-
tion fournit le nombre d'octets disponibles, ce qui donne
une idée de la taille mémoire libre à ce moment.
Exemple :
?FRE(0)
SrL95E
30) GET
Cette commande ne fonctionne qu'en mode différé. Elle
attend qu'une touche quelconque du clavier soit pressée
et prend en compte ce qui est tapé sans qu'on ait besoin
de taper sur RETURN, ce qui différencie GET de INPUT.
L'emploi classique de GET consite à l'associer à
l'instruction VAL ainsi :
10 GET A$
20 A = VAL(A$)
ce qui permet de manipuler ensuite non plus des chaînes
de caractères numériques mais des variavle numériques.
Notez que [CTRL] [C] est considéré comme caractère
alphanumérique et ne peut pas interrompre le programme
exécutant une instruction GET.
31) GOSUB N
Cette commande provoque un branchement du programme à
la ligne de numéro N où débute une série d'instructions
se terminant par RETURN et formant un sous-programme
(SUBROUTINE).
Mais le GOSUB ne se contente pas d'être un GOTO numé-
roté, il conserve aussi en mémoire l'adresse de la ligne
qui le suit et à laquelle le programme reviendra après
RETURN.
Exemple :
GOSUB 1000
1000
RETURN
32) GOTO N
Cette commande opère un branchement inconditionnel à
la ligne du programme portant le numéro N qui doit donc
exister dans le programme.
— 156 -
Exemple :
40 GOTO 100
100 :
33) GRAB
Cette commande assigne la place en mémoire de :
9800 à B400 (48K), ou de
1800 à 3400 (16K), pour utiliser la mémoire RAM.
34) HEXS(V)
Cette fonction calcule la valeur hexadécimale de la
valeur V.
Exemple :
PRINT HEXS(36)
35) HIMEM
Cette commande abaisse le niveau supérieur de la
mémoire utilisable pour les programmes basic, rendant la
mémoire située au-dessus utilisable pour des programmes
machine.
Exemple :
HIMEM Ë 7200
36) HIRES
Cette commande enclenche le mode graphique haute
résolution. Le fond est mis au noir, l'"encre” est
blanche, et le curseur est placé en haut et à gauche de
l'écran, tandis que les lignes de texte sont maintenues
dans la couleur précédente.
— 157 -
37) IF/THEN
+. ELSE
Si l'expression suivant le IF est vraie, alors toutes
les instructions suivant le THEN sont exécutées. Si l'ex-
pression est fausse, alors toutes ces instructions sont
ignorées et le programme exécute les instructions suivant
ELSE. ELSE peut être omis.
Exemple
10 IF A 10 THEN GOTO 20
15 PRINT OK
20 :
38) INK N
Cette commande modifie la couleur de l'encre d'écri-
ture dans toute la surface de l'écran. N est un entier
compris entre 0 et 7.
Exemple
39) INPUT
Cette instruction arrête l'exécution d'un programme
et attend une introduction de données avant de continuer.
Les données rentrées sont assignées à des variables.
Exemple
INPUT N$,A
ou : INPUT "AGE?";B
40) INT(X)
Fonction retournant la partie entière de l'expression
numérique entre parenthèses, c'est-à-dire le plus grand
entier inférieur ou égal à la valeur de l'expression en-
tre parenthèses.
— 158 -
Exemple :
?2INT(PI)
donne 3.
41) KEYS
Ce mot-clé signifie qu'ORIC attend une donnée du cla-
vier (keyboard) mais continue l'exécution, qu'une touche
ait été pressée ou pas.
Exemple :
X$ = KEYS
assignera à X$ la valeur de n'importe quelle touche pres-
sée.
42) LEFTS(AS,N)
Cette fonction d'une chaîne de caractère A$ et d'un
entier N retourne N premiers caractères en partant de la
gauche de la chaîne de caractères en question.
43) LEN(AS)
Cette fonction retourne la longueur de la chaîne de
caractères placée entre parenthèses.
44) LET
Cette commande, qui permet d'assigner une valeur à
une variable, est en fait optionnelle.
LET A = 4
équivaut à A = 4
45) LIST
Liste les lignes spécifiées ou tout le programme sur
l'écran.
— 159 -
Exemple
LIST 100
liste la ligne 100 du programme, mais
LIST
liste tout le programme.
46) LLIST
Cette commande équivaut à la précédente, mais la sor-
tie, au lieu de se faire sur l'écran, se fait sur l'im-
primante.
Exemple
LLIST 50
ou : LLIST
47) LNC)
Cette fonction retourne le logarithme népérien de X.
Par définition de cette fonction, X doit être strictement
positif.
Le logarithme néperien est la fontion réciproque de
l'exponentielle (cf EXP(X)).
Exemple :
?LN(1)
produira 0.
48) LOG(X)
Cette fonction retourne le logarithme décimal de X,
qui doit être strictement positif.
Exemple :
?L0G(100)
donnera 2.
— 160 -
49) LORES N
Cette commande enclenche le mode basse résolution.
Le fond de l'écran est mis au noir. Lorsque N est
égal à O0, les caractères imprimés sont les caractères
standard, et lorsque N vaut 1, ce sont les caractères du
type alterné - représentant des figures stylisées - qui
sont reproduits.
Exemple
LORES 0
50) MID$(Z$,A,L)
Cette fonction retourne la chaîne de caractères de
longieur L débutant au Aième caractère de la chaîne de
caractères Z$.
Si A$ = “ORIC", MID$S(A$,3,2) retournera "IC"
51) MUSIC A,B,C,D
Cette commande produit une note de musique rangée sur
le canal A (1,2 ou 3), définie par le numéro B de l'octa-
ve (0 à 7), par le numéro C de la note (1 à 12), et jouée
«
avec un volume D (0 à 15). Pour plus de détails, se re-
porter au chapitre traitant des commandes de son.
Exemple
MUSIC 1,3,5,10
52) NEW
Cette commande détruit le programme courant, ainsi
que toutes les variables. Cette commande est utile lors-
qu'on veut tout nettoyer avant de repartir à zéro pour un
autre programme.
Exemple
NEW
— 161 -
53) ON ... GOSUB
Cette commande branche le programme à la Nième éti-
quette d'un sous-programme qui suit le mot-clé GOSUB.
Exemple :
ON N GOSUB 200,300
testera N ;
. si N = 1, le branchement se fait à la ligne 200 ;
. si N = 2, il se fait à la ligne 300.
54) ON ... GOTC
Cette commande branche le programme à la Nième éti-
quette spécifiée après le mot-clé GOTO.
Exemple
ON N GOTO 1000,2000
branchera le programme à la ligne d'étiquette 2000 si N =
2.
55) PAPER N
Cette commande change la couleur du fond de l'écran
suivant la valeur de l'entier N (de O à 7).
Exemple :
PAPER 3
56) PATTERN X
Cette commande fait appel au générateur de pointillés
pour les commandes DRAW.
X est un entier compris entre 0 et 255. Sa configura-
tion binaire avec une succession de 0 et de 1 schémtise
la forme du pointillé qui affectera le segment défini par
— 162 -
DRAW. Les 1 correspondent à des traits pleins et les 0 à
des vides. Ainsi PATTERN 255 produira un trait plein car
255 en base 10 équivaut à 111111l1en base 2.
57) PEEK (X)
Cette fonction fournit le contenu de la case mémoire
dont l'adresse est l'entier X.
Exemple
?PEEK(58)
58) PI
Ce mot clé est la constante PI = 3,1415...
59) PING
Cette commande produit un son prédéfini ressemblant à
une sonnerie.
60) PLAY A,B,C,D
Cette commande musicale définit la sortie sonore d'un
son ou d'une note grâce aux quatre paramètres suivants
. À, entier de O à 7, définit la combinaison des canaux
purs.
. B, entier de O à 7, définit la combinaison des canaux
bruités.
. C, entier de 1 à 7, définit le mode de sortie.
. D, entier de O0 à 32767, définit la période de sortie.
Pour plus de détails, se reporter au chapître des
commandes sonores.
61) PLOT X,Y,A$
Cette commande inscrit le caractère A$ sur l'écran,
en mode LORES ou TEXT, à l'endroit défini par les
coordonnées X et Y. A la place de A$, on peut mettre un
— 163 -
«
attribut spécifique à certaines opérations graphiques
évoluées, i.e. un nombre compris entre O0 et 31 (cf annexe
H), ou le code ASCII d'un caractère.
62) POINT (X,Y)
Cette fonction retourne 0 si le point élémentaire
d'affichage graphique est dans la couleur du fond de
l'écran, et -1 si ce n'est pas le cas, c'est-à-dire si ce
point est imprimé par dessus dans la couleur de l'‘"en-
cre". X et Y sont les coordonnées absolues de ce point.
63) POKE N,V
Cette commande écrit la valeur V (0-255) à la case
mémoire d'adresse N de l'écran. Si N renvoie à une case
mémoire où est rangé un octet servant à définir un carac-
tère, V est compris entre 0 et 63.
64) POP
Cette commande sans paramètre joue le rôle d'une
instruction RETURN, à la différence qu'après une instruc-
tion POP, la prochaine instruction RETURN rencontrée
opère un retour à l'instruction suivant non pas le der-
nier GOSUB, mais l'avant-dernier.
65) POS
Ce mot-clé retourne la position horizontale du
curseur.
Exemple
10 A = POS
66) PRINT
Cette commande imprime des variables, des nombres et
des chaînes de caractères sur l'écran.
Notez que ? peut être utilisé à la place du mot PRINT
mais sera converti en PRINT en listant le programme par
LIST.
— 164 -
Exemple :
PRINT A,B,CS
ou encore : PRINT "LE RESULTAT EST";B
67) PULL
Cette commande tire une étiquette de l'ensemble des
boucles REPEAT.
Exemple :
PULL
68) READ
Cette commande lit une ou plusieurs données contenues
dans une liste DATA et les assigne dans l'ordre de lectu-
re aux variables qui suivent le mot-clé READ
Exemple :
10 READ A,B
20 DATA 100,50
69) RELEASE
Cette commande assigne une aire de mémoire décrite
dans la commande GRAB aux manipulations concernant l'é-
cran en mode HIRES.
70) REM
Ce mot-clé permet d'introduire des commentaires,entre
des instructions, dans un programme. Tout ce qui suit le
mot REM est ignoré par l'interpréteur.
Exemple :
10 REM IGNORE CELA
71) REPEAT ... UNTIL
— 165 -
Cette commande crée une boucle pour répéter toutes
les lignes du programme jusqu'à une instruction où il est
procédé à un test. Si celui-ci est faux, l'exécution
refait un tour et si le test est vrai, l'exécution est
poursuivie à la ligne suivant UNTIL.
72) RESTORE
Cette commande replace le pointeur de lecture d'une
instruction READ à la première donnée de la liste DATA.
Exemple :
5 READ A,B
10 DATA 10,20
15 RESTORE
20 READ C
25 ?C
fournira à C la valeur 10.
73) RETURN
Cette commande indique la fin d'un sous-programme et
renvoie la suite du déroulement de l'exécution à l'ins-
truction suivant la dernière instruction GOSUB lue.
74) RIGHTS (AS,N)
Cette fonction retourne les N derniers caractères en
partant de la droite, d'une chaîne de caractère A$.
75) RND(X)
Cette fonction fournit automatiquement un nombre
aléatoire chaque fois qu'elle est appelée. Si X > ll,
alors RND(X) se trouve entre O0 et 1. Si X = O le nombre
généré en dernier est produit, si X < 0, le nombre pro-
duit est le même pour chaque X.
76) RUN
Cette commande lance l'exécution d'un programme en
basic.
— 166 -
77) SCRN (X,Y)
Cette fonction retourne le code ASCII pour un carac-
tère placé à la position de coordonnées (X,Y) en mode
LORES ou TEXT.
78) SGN(X)
Cette fonction retourne -1 si l'argument X est néga-
tif et 0 si l'argument X est positif ou nul.
79) SHOOT
Cette commande produit un son prédéfini imitant le
bruit d'un coup de feu.
80) SIN X
Cette fonction calcule le sinus de l'angle dont la
valeur en radians est X.
Pour mémoire, sur le cercle
trigonométrique unité, la lon-
gueur du segment OB représente
la valeur du sinus. Si B est
4) au-dessus de A, le sinus est
À positif et l'angle varie entre
0 et 7.
Si B est en-dessous de 0, le
sinus est négatif et l'angle
varie entre 0 et -#.
81) SOUND A,B,C
Cette commande musicale produit un son défini par :
. À : numéro du canal où est rangé le son (1 à 6) ;
. B : période de vibration du son ;
. C : volume sonore (0 à 15).
— 167 -
82) SPC (N)
Cette fonction laisse un espace de N positions sur
l'écran où N est un entier de 0 à 255. On l'utilise en
impression, par exemple :
PRINT "AT"SPC(3)"CHOUM"
produira : AT CHOUM
83) SQR(X)
Cette fonction fournit la racine carrée de l'argument
X, c'est-à-dire le nombre positif dont le produit par
lui-même donne X, lequel doit obligatoirement être posi-
tif ou nul.
Exemple : ?2SQR(3)
fournit : l:/32%.34
84) STOP
Cette instruction arrête l'exécution d'un programme
et provoque un message BREAK IN 10 si, à la ligne 10, il
y a 10 STOP.
85) STRS(N)
Cette fonction convertit un nombre en la chaîne de
caractères correspondante. Par exemple STR$(10) convertit
la constante numérique 10 en la chaîne de deux carctères
1 et O accolés, soit 10. Cette fonction est utile pour
écrire des nombres au milieu de l'écran, car on utilise
PLOT qui ne peut écrire que des chaînes de caractères,
d'où la nécessité de transformer ces nombres en chaînes
de caractères, ce qui est assuré par STRS.
86) TAB(N)
Cette commande tabule l'impression, c'est-à-dire la
déplace de N positions à partir de la gauche de l'écran.
N ne doit pas dépasser 249.
— 168 -
Exemple :
PRINT TAB(3)
87) TAN(X)
Cette fonction calcule la valeur de la tangente de
l'angle dont la valeur en radians vaut X.
Pour mémoire, rappelons que
dans le cercle unité, la lon-
gueur AB mesure la tangente de
l'angle f + On ne peut pas
avoir X = 71/2 = 1,5707... car
la tangente serait infinie et
n'est donc pas définie.
88) TEXT
Cette commande enclenche le mode TEXT.
89) TROFF
Cette commande supprime le suivi (trace) de l'exécu-
tion qui consiste à faire imprimer le numéro de la ligne
où passe l'interpréteur au moment de l'exécution.
90) TRON
Cette commande enclenche le suivi (trace de l'exécu-
tion du programme en affichant le numéro de la ligne de
chaque instruction exécutée sur l'écran.
91) TRUE
Ce mot-clé attribue la valeur -l au résultat d'un
test logique (réciproque de FALSE).
Exemple :
A = TRUE
— 169 -
92) USR(N)
Cette commande appelle un sous-programme en langage
machine en lui transmettant l'argument N.
93) VAL(NS)
Cette fonction transforme une chaîne de caractères
numériques en la valeur correspondante.
Exemple
A = VAL(AS)
Si A$ n'est pas une chaîne de caractères numériques,
VAL(AS) vaut O0.
94) WAIT N
Cette commande provoque une pause, dans l'exécution
du programme, d'une durée de N centisecondes. Il est im-
possible de provoquer une interruption de l'exécution
d'une pause par [CTRL] [C].
Exemple
WAIT 100
signifie faire une pause d'1 seconde.
95) ZAP
Cette commande produit un son prédéfini imitant celui
d'un “pistolet à laser”.
— 170 -
Annexe B LES MESSAGES D'ERREUR
Votre Oric contient un interpréteur qui vérifie sys-
tématiquement chaque instruction basic juste avant de
l'exécuter. S'il n'arrive pas à comprendre quelque chose
dans cette instruction ou s'il y détecte une erreur pré-
cise, il va délivrer aussitôt ce qu'on appelle un message
d'erreur. Ces messages d'erreur sont en nombre fini et
Oric en contient vingt. Mais avant de les examiner un par
un, il faut noter la légère différence qui existe entre
les messages d'erreur délivrés lorsque l'on travaille en
mode direct et ceux délivrés lorsque l'on travaille en
mode différé (i.e. lorsque l'on écrit un programme). Dans
les deux cas, les messages d'erreur sont les mêmes ; seu-
lement, si vous êtes en mode direct au moment où l'erreur
s'est produite, l'interpréteur se contente de délivrer le
seul message d'erreur.
Par exemple, l'enregistrement
PRIN "BONJOUR"
provoquera immédiatement le simple message d'erreur sui-
vant : SYNTAX ERROR, c'est-à-dire ERREUR DE SYNTAXE.
Comme vous l'avez remarqué, il a été oublié le T de
PRINT.
- 171 -
Par contre, si vous êtes en mode différé au moment où
l'interpréteur détecte une erreur, celui-ci vous délivre
non seulement le message d'erreur approprié, mais il ins-
crit de plus, à sa suite, le numéro de la ligne où il a
détecté l'erreur.
Par exemple, le mini-programme
5 PRIN "BONJOUR"
lancé par RUN, provoquera le message d'erreur suivant
SYNTAX ERROR IN 5
Ce renseignement supplémentaire peut faire gagner
beaucoup de temps, mais il faut, ici, faire la remrque
suivante. Ce n'est pas parce que l'interpréteur a détecté
une erreur à une certaine ligne qu'une correction devra
être apportée, forcément, à cette ligne. L'erreur peut
provenir d'instructions précédentes qui, bien que correc-
tes du point de vue basic, calculent des choses fausses.
Par exemple, le programme
5 À = INT(O.5)
10 B = 10
20 C=B /A
30 PRINT C
provoquera inévitablement le message d'erreur suivant
DIVISION BY ZERO ERROR IN 20
La correction peut évidemment être apportée à la li-
gne 20, si au lieu de diviser B par A, on voulait faire
le produit B * À ; mais l'erreur peut aussi provenir de
la variable A, qui ne devrait pas avoir la valeur nulle
si au lieu de À = INT(0.5), on avait écrit A = INT(0O.5) +
1. Retenez de ce petit exemple que l'erreur n'est pas
forcément là où le message d'erreur la situe. C'est à
vous de voir dans chaque cas.
Au moment où vous débutez votre apprentissage infor-
matique sur Oric, vous avez l'occasion de rencontrer plus
d'une fois chacun de ces messages d'erreur.
mL /2
Mais c'est en sachant d'autant mieux ce qu'ils signifient
que vous apprendrez à corriger d'autant plus vite vos er-
reurs, et que vous les rencontrerez de moins en moins
souvent. Lorsque l'interpréteur ne publie plus aucun mes-
sage d'erreur, cela signifie seulement que ce que vous
avez écrit est cohérent du point de vue basic, et est
exécutable par Oric ; cela ne signifie pas pour autant
qu'il exécute ce que vous vouliez lui faire exécuter.
Voici les vingt messages d'erreur possibles, qui sont
délivrés en anglais par Oric. Ils sont classés par ordre
alphabétique. Nous vous donnons ici leur traduction, leur
signification et quelques indications sur les origines
possibles des erreurs détectées.
1) BAD SUBSCRIPT (mauvais indice)
On a cherché un élément de tableau qui ne peut pas
exister, vu la dimension qui a été donnée pour ce ta-
bleau. Par exemple À a été dimensionné par DIM A(20,20)
et l'on cherche A(24,25), ce qui est en contradiction
avec la dimension fournie, ou encore, ce qui est pire, on
manipule A(24,25) alors que À avait été dimensionné par
DIM A(5).
Dans ce cas, il vous faut revoir la compatibilité
entre les valeurs des indices des éléments de tableau
présents dans la ligne du programme qui a provoqué le
message d'erreur, et les instructions dimensionnant ce ou
ces tableaux.
2) BAD UNTIL (mauvais UNTIL)
L'interpréteur vient de lire une instruction UNTIL
sans avoir lu auparavant une instruction REPEAT. Il vous
reste à ajouter le REPEAT manquant ou à supprimer l'UNTIL
de trop.
3) CAN'T CONTINUE (on ne peut continuer)
Oric essaie en vain de continuer ou de reprendre
l'exécution d'un programme. Ce message peut paraître dans
deux cas. Lorsqu'Oric a détecté une erreur et qu'au lieu
de chercher à la corriger, vous essayez de reprendre
l'exécution du programme en tapant CONT.
— 173 -
Ce message vient aussi lorsque vous avez interrompu
l'exécution d'un programme et que pendant cette interrup-
tion vous avez modifié, ajouté ou détruit une ligne du
programme qui empêche la poursuite normale de l'exécution
du programme. Dans ce cas, on peut parfois reprendre
l'exécution par un GOTO numéroté. Remarquez que si vous
avez modifié le programme, vous ne pouvez plus reprendre
son exécution par CONT ; il faut utiliser un GOTO numé-
roté.
&) DISTYPE MISMATCH (incompatibilité entre modes
d'écriture)
Oric cherche à faire des choses spécifiques à un mode
d'écriture (HIRES ou TEXT) alors que l'on ne se trouve
justement pas dans ce mode. Le cas classique où se pro-
duit ce message est celui où l'on cherche à dessiner dans
le mode TEXT.
5) DIVISION BY ZERO (division par zéro)
Ce message peut provenir d'une variable qui n'a pas
été initialisée et a la valeur nulle au moment du calcul,
car toute variable non initialisée explicitement a la
valeur nulle dès le début du programme.
6) FORMULA TOO COMPLEX (expression trop complexe)
L'expression contenue dans la ligne qui a provoqué ce
message est trop compliquée pour Oric. Par exemple, ce
message est délivré si la ligne contient plus de deux
IF/THEN.
7) ILLEGAL DIRECT (interdit d'emploi en mode direct)
On a cherché à utiliser une instruction ou une com-
mande en mode direct, à partir du clavier, alors que
c'était impossible.
Par exemple et pour mémoire, les instructions INPUT,
GET, DEF FN, DATA sont interdites d'emploi en mode
direct.
8) ILLEGAL QUANTITY (valeur erronée)
On a cherché à calculer la valeur d'une fonction en
un point qui sortait de son domaine de définition.
— 174 -
Par exemple :
argument de LOG négatif ou nul
. argument de SQR négatif
. O0 élevé à une puissance négative
indice d'un tableau négatif ou supérieur à 32767
9) NEXT WITIHOUT FOR (NEXT sans FOR correspondant)
L'apparition de ce message peut provenir de plusieurs
causes : mauvaise imbrication de boucles entre elles, ou-
bli de supprimer un NEXT après une correction qui a éli-
miné un FOR...
10) OUT OF DATA (données épuisées)
On cherche à lire encore des données alors que celles
contenues dans tous les DATA ont déjà été lues. Ce messa-
ge provient généralement d'un manque de données dans les
DATA par rapport à ce que demandent les instructions de
lecture (INPUT ou READ).
11) OUT OF MEMORY (mémoire épuisée)
Le programme est trop long ou bien demande trop de
variables, ou encore contient plus de seize boucles et
GOSUB emboîtés les uns dans les autres.
12) OVERFLOW (dépassement de capacité)
3g0n nombre, plus grand en valeur absolue que 1,/041 x
10 a été élaboré, à un moment donné, dans un calcul.
Pour les nogbres dont la valeur absolue est inférieure à
2,9 x 10 ce message d'erreur n'apparaît pas, car
Oric les assimile à zéro.
13) REDIM'D ARRAY (tableau redimensionné)
Ce message d'erreur se produit dans le cas suivant
Un tableau a été déjà dimensionné et on essaie abusive-
ment de le redimensionner, en relisant cette instruction
ou en lisant une nouvelle instruction le dimensionnant.
14) REDO FROM START (recommencez au début)
Au cours d'une instruction INPUT, on a essayé de ren-
trer une chaîne de caractères alors qu'on demandait un
= 175 =
nombre. Il faut recommencer à rentrer depuis le début les
valeurs demandées par l'INPUT en question.
15) RETURN WITHOUT GOSUB (retour sans GOSUB)
L'interpréteur vient de lire un RETURN alors qu'il
n'avait pas lu de GOSUB le lui annonçant. Cette erreur
peut provenir d'une exécution lancée par un GOTO numéroté
qui a sauté le GOSUB, ou bien de l'oubli de l'instruction
END en fin du programme principal suivi d'un sous-pro-
gramme.
16) STRING TOO LONG (chaîne de caractères trop longue)
Ce message d'erreur se produit lorsqu'on essaie de
fabriquer, par concaténation, une chaîne de caractères de
plus de 255 caractères, ce qui est interdit.
17) SYNTAX ERROR (erreur de syntaxe)
Ce message sera un des plus fréquemment rencontrés
par le novice en informatique. Il signifie que l'instruc-
tion qui a provoqué ce message est incompréhensible pour
l'interpréteur basic. Les causes peuvent être variées
oubli de parenthèse, caractères illégaux, mauvaise ponc-
tuation, faute d'orthographe dans un mot-clé, virgule
manquante, variable d'un certain type employée à tort,
etc... Il vous reste donc à relire l'instruction incrimi-
née et à vérifier l'exactitude, du point de vue basic, de
chacun des caractères écrits.
18) TYPE MISMATCH (incompatibilité entre variables
numériques et alphanumériques)
Ce message se produit lorsqu'on essaie d'assigner une
chaîne de caractères à une variable numérique ou vice
versa, ou encore lorsque l'on fournit une chaîne de
caractères comme argument d'une fonction qui n'accepte
que des nombres ou vice versa.
19) UNDEF'D STATEMENT (instruction non définie)
On essaie d'accéder, en utilisant une instruction
GOTO, GOSUB ou THEN, à une ligne dont le numéro est
inexistant. Ce message provient souvent de corrections
mal faites dans le programme. Par exemple, on a modifié
— 176 -
un numéro de ligne et l'on a oublié de reporter cette
correction sur l'instruction GOTO qui renvoyait à cette
ligne.
20) UNDEF'D FUNCTION (fonction non définie)
On fait appel à une fonction qui n'a pas été définie
par l'instruction DEF FN. Cela peut provenir d'un oubli
de définition de la fonction, ou peut-être tout simple-
ment d'une mauvaise orthographe de celle-ci.
— 177 -
Annexe C UTILISATION DE CASSETTES AVEC ORIC
Oric ne peut garder en mémoire qu'un seul programme
basic. Aussi, lorsque vous aurez écrit des programmes re-
lativement longs, vous devrez les stocker sur cassette
pour les réutiliser quand vous voudrez, sans avoir à les
retaper, sur un Oric.
= CONNEXION D'UN MAGNETOPHONE A CASSETTES A UN ORIC
La face arrière du boîtier d'Oric comporte une prise
DIN à sept trous pour la connexion du magnétophone. Deux
solutions sont possibles
. Si la prise de votre magnétophone comporte aussi
sept trous, aucun problème ne se pose et le moteur
de votre magnétophone sera commandé automatiquement
par Oric, sans qu'aucune intervention manuelle ne
soit nécessaire.
. Si la prise de votre magnétophone ne comporte que
trois à cinq trous, seuls trois d'entre eux sont à
utiliser et vous devrez donc demander à votre
distributeur un câble à trois fils. Vous devrez, à
chaque opération avec le magnétophone, mettre en
marche celui-ci manuellement et l'arrêter ensuite.
— 178 -
Deux vitesses d'enregistrement/lecture peuvent être
utilisées par Oric :
. 240 caractères par seconde (2400 bauds)
Cette vitesse nécessite des têtes de lecture/ écri-
ture propres et biens alignées, et des cassettes de
bonne qualité.
+ 40 caractères par seconde (300 bauds) moins rapide,
mais plus sûre.
= SAUVEGARDE ET CHARGEMENT D'UN PROGRAMME
Pour sauvegarder un programme sur cassette, mettez
votre magnétophone en position d'enregistrement, tapez
CSAVE "XX" et appuyez sur [RETURN]. (XX est le nom de vo-
tre programme, actuellement encore dans la mémoire vive ;
ce nom peut compter jusqu'à 17 caractères y compris chif-
fres, points, barres obliques). Le message “SAVING XX"
apparaît tout en haut de l'écran : ce qui veut dire que
votre programme est bien en cours d'enregistrement. Lors-
que c'est terminé, “Ready” s'affiche sur l'écran.
Puis, quelques jours plus tard vous désirez recharger
"XX" dans Oric. Branchez alors correctement votre magné-
tophone et tapez : CLOAD "XX" après avoir mis votre
magnétophone en position lecture. Oric cherche alors "XX"
et pour l'indiquer affiche le message “SEARCHING". En
haut de l'écran ce message se transforme en “LOADING XX".
Mais peut-être avez vous oublié le nom de votre pro-
gramme ? Peu importe, recommencez la manipulation en
tapant CLOAD "“". Le programme chargé sera le premier
trouvé, si ce n'est pas le bon, recommencez jusqu'à ce
que ce soit le bon.
La commande CSAVE fait enregistrer à la vitesse de
2400 bauds. Si vous voulez soigner votre enregistrement
dans le cas où votre magnétophone n'est plus de bonne
qualité, vous devez enregistrer à 300 bauds. Si à 2400
bauds un problème survient, vous risquez de voir apparaî-
tre, au cours du chargement du programme, le message
d'erreur : FILE ERROR - LOAD ABORTED (erreur de fichier,
chargement abandonné). Pour éviter cela, lors de la sau-
vegarde, tapez : CSAVE “PROGl", S. PROGL étant le nom du
— 179 -
programme, le S vient de slow (lent en anglais) et
commande l'enregistrement à la vitesse de 300 bauds.
Pour les chargements de programmes sauvegardés 300
bauds, tapez CLOAD “"PROG1", S sinon Oric s'attendra à une
vitesse de 2400 bauds. Si vous souhaitez faire exécuter
votre programme automatiquement une fois qu'il a été
chargé, tapez CSAVE "PROGl", AUTO.
Be Be
Vous pouvez également sauvegarder des blocs mémoire.
Pour cela vous devez connaître l'adresse, la localisation
du début et de la fin de ce bloc. Ainsi :
CSAVE “PROGMEM", AË400, E H499
Cette instruction sauvera le bloc ‘(appelé par vous
PROGMEM) situé, rangé en RAM entre les localisations # 400
et H 499. Le signe # indique qu'il s'agit de nombres hexa-
décimaux. Le A et le E sont obligatoires : ils indiquent
le début et la fin. Vous pouvez utiliser des nombres dé-
cimaux (sans le signe # ).
— 180 -
Annexe D UTILISATION D'UNE IMPRIMANTE
Oric peut être utilisé avec toute imprimnte ayant
une interface Centronics. Pour cela, l'imprimante doit
être connectée avant d'être mise en marche. Si tout est
correct, la tête de l'imprimante doit s'aligner d'elle-
même sur la position de départ dès que l'on alimente.
Dès que l'imprimante est branchée, tapez le programme
suivant
10 REM ** ESSAI D'IMPRESSION **
20 FOR N = O TO 255
30 LPRINT N, CHRS(N)
40 NEXT N
Tapez ensuite
LLIST
Cela listera le programme sur l'imprimante au lieu de
l'écran. Si vous n'obtenez pas des caractères “normaux”,
mais des signes inattendus, consultez la notice de l'im-
primante pour changer les caractères d'impression,
jusqu'à obtenir un listage satisfaisant.
— 181 -
Faites alors exécuter le programme ci-dessus qui est une
simple boucle, imprimant un nombre suivi du caractère
dont il est le code ASCII. Cela vous montrera quels
caractères vous pouvez obtenir, et surtout quels nombres
correspondent à des codes de contrôles pour l'imprimante.
Les codes de contrôle commandent des actions telles que
le retour du chariot, les caractères serrés ou non, pe-
tits ou grands, ou l'avance du papier, etc...
Par exemple essayez :
les caractères doublent de taille.
annule cette action.
LPRINT CHR$(31)
LPRINT CHR$(30)
REMARQUE : Les codes de contrôle peuvent donc
vous être très utiles pour obtenir des impressions
soignées, riches, utilisant des gadgets vous
permettant d'obtenir des effets variés ou esthéti-
ques.
- 182 -
Annexe E NUMERATION HEXADECIMALE,
REPRESENTATION DES REELS ET DES ENTIERS
1. LA NUMERATION HEXADECIMALE
Ainsi que vous l'avez vu dans les chapitres de pré-
sentation, la configuration d'un microordinateur est tel-
le que les informations sont stockées dans des circuits
intégrés.
La représentation physique de ces informations est
donc un ensemble d'"interrupteurs" qui sont soit ouverts,
soit fermés. L'état d'un interrupteur constitue une
information élémentaire que l'on appelle bit ; un bit
vaut donc soit 0, soit 1.
Chaque information est donc traduite en bits par la
machine, c'est-à-dire en langage binaire. Pour plus de
commodité technologique, ces bits sont réunis par paquets
de huit que l'on appelle octets. L'octet est donc l'unité
de base pour votre Oric.
Puisque Oric “travaille” sur des octets, il est donc
commode d'utiliser une numération en tenant compte. C'est
pourquoi on utilise une numération par paquets de quatre
bits (par ensemble de seize états possibles).
— 183 -
À ce niveau il n'est pas inutile de rappeler les
principes de la numération. Vous utilisez couramment la
numération en base 10 (décimale) ; ceci n'ayant vraisem-
blablement de raison d'être que parce que nous possédons
10 doigts. En numération en base 10 nous utilisons 10
chiffres 0, 1, ..., 9. Chaque nombre, en base 10, ne s'é-
crit qu'à l'aide de ces 10 chiffres.
Par exemple, le nombre 7864 s'interprète comme
& unités + 6 dizaines + 8 centaines + 7 milliers,
c'est-à-dire (7864) 2 = 4 + 6 x (base) + 8 x (base
x base) + 7 x (base x fase x base).
En numération en base 16 (ou hexadécimale), le prin-
cipe est strictement le même. On utilise 16 chiffres : 0,
1, ..., 9, À, B, C, D,E, F
La traduction en base 10 de ce chiffre s'écrit :
(ie 7 (0)
Oh =
Ag * GO)
Elie: * Co
Ainsi le nombre AlE7 vaut 7 + E x (base) + 1 x (base
x base) + À x (base x base x base),
soit (AlE7)
(16 x 16 x 1é
Le passage de la base décimale à la base hexadécimale
s'effectue par l'opération inverse.
7 + 14 x (16) + 1 x (16 x 16) + 10 x
(41487);
Considérons l'entier (N) 0° Pour obtenir son écri-
ture en base 16, on divise a par la valeur 16 jus-
qu'à obtenir un reste plus petit que la base. L'écriture
s'effectue à l'aide de la valeur successive des
(restes);£-
Par exemple traduisons (125342), en base 16 :
— 184 -
125 342 : 16
13 3 : 7 833 : 16
0 54 : 1 43 : 489 : 16
062 : 153 : 09 : 30 : 16
14 : 09 : : 14 :
1 : 16
15550
E 9 9 E 1
Donc (125 342), = 14 + 9 x (16) + 9 x (16 x 16) + 14 x
(16 x 16 x 16) + 1 x (16 x 16 x 16 x 16)
(125 342), = (1E99E).
Il ne vous reste donc plus qu'à vérifier sur quelques
exemples que vous avez compris le principe du passage
d'une numération à l'autre. N'oubliez pas que votre Oric
exécute facilement les conversions de la base décimale à
la base hexadécimale et réciproquement.
2. LA REPRESENTATION DES REELS
Comme vous l'avez vu au chapitre 3 votre Oric stocke
les réels sur cinq octets (un octet pour l'exposant et
quatre pour la mantisse), voyons comment cela se passe
physiquement.
31 30 25 24 49 13 46 42 9 8 6 1
Lee RETE
éd bit de bit leg
qe exposant signe mant'sse à 4
« Pour l'exposant, il y a 7 bits ayant deux valeurs
(0, 1) pour le représenter, puisque le dernier bit est
“bloqué"_par le signe. Donc pour représenter l'exposant
il y a 2° = 128 positions (0—127, -127—0).
Puisque l'on raisonne en base deux, les exposants
vont donc varier de :
27127 à 2127
. La mantisse : elle est représentée sur 4 octets. Le
dernier bit est le bit du signe et le premier bit est
tou jours bloqué à 1.
— 185 -
En fait, la mantisse est écrite en logarithme en base
2 : pour traduire en base hexadécimale le contenu d'une
mantisse, on repère chaque bit valant 1 par sa position.
(Ces bits sont appelés i et leur position pi):
La mantisse vaut
mantisse = somme (2) Pi sur tous les bits
Ainsi, si on considère le contenu de la mantisse du
schéma ci-dessus on a :
mantisse = 27! + 2
donc la mantisse varie entre : 1/2< mntisse < !1
-1/2 5 mantisse > -1
(On obtient 1/2 quand tous les bits du 2ème au 32ème sont
à zéro).
(On obtient 1 quand tous les bits du 2ème au 31ème sont à
1).
2 127
Donc, en valeur absolue 27128 < réel < 2
La mantisse est stockée, ur 31 bits + bit de signe :
la précision vaut 1/2 x 2 (soit 10 chiffres signifi-
catifs).
3. REPRESENTATION DES ENTIERS
Vous avez vu au chapitre 3 que votre Oric stockait
les entiers dans deux octets, voyons comment cela se tra-
duit physiquement.
16 5 8 1
DS ER Rne EEes
bit contenant Le signe
de L'enfier
11 y a 15 bits pour stocker la valeur absolue d'un
entier (valeur absolue (X) = Max (X;-X)), il y a donc
2 positions possibles ; c'est pourquoi Oric pe les
fait varier, en valeur absolue, qu'entre 0 et 2 - 1
= 32767.
— 186 -
ANNEXE F
Codes ASCII
ASCII ASCII ASCII
Code Caractère Code Caractère Code Caractère
000 NUL 036 $ 072 H
001 SOH 037 % 073 I
002 STX 038 & 074 \J
003 ETX 039 | 075 K
004 EOT 040 ( 076 L
005 ENQ 041 ) 077 M
006 ACK 042 , 078 N
007 BEL 043 + 079 O
008 BS 044 : 080 P
009 HT 045 - 081 Q
010 LF 046 ; 082 R
011 VT 047 / 083 S
012 FF 048 0 084 T
013 CR 049 1 085 U
014 SO 050 2 086 V
015 SI 051 3 087 W
016 DLE 052 4 088 X
017 DCI 053 5 089 Y
018 DC2 054 6 090 Z
019 DC3 055 7 091 [
020 DC4 056 8 092 \
021 NAK 057 9 093 ]
022 SYN 058 : 094 t
023 ETB 059 ; 095 £
024 CAN 060 < 096 ©
025 EM 061 = 097 a
026 SUB 062 > 098 b
027 ESCAPE 063 ? 099 c
028 FS 064 @ 100 d
029 GS 065 A 101 e
030 RS 066 B 102 f
031 US 067 C 103 g
032 SPACE 068 D 104 h
033 ! 069 E 105 i
034 , 070 F 106 j
035 # 071 G 107 k
108 l 115 8 122 Z
109 m 116 t 123 {
110 n 117 u 124 |
ill 0 118 v 126 |
112 p 119 w 126 —
113 q 120 x 127 DEL
114 r 121 y
ASCII codes are in decimal.
LF-—Line Feed, FF=Form Feed, CR=Carriage Return, DEL= Rubout
- 187 -
Annexe G CARTE
MODE HIRES
ROM
ESPACE
ECRAN
CARACTERES
ALTERNES
CARACTERES
STANDARD
e + ee
FFFF
co00
: BFEO
A000
9C00
9800
MEMOIRE D'ORIC
MODE TEXT
FFFF
ROM :
it cO00
ESPACE
: BFEO
ECRAN
: BB80
CARACTERES
ALTERNES
: B800
CARACTERES
STANDARD
B400
Les adresses sont exprimées en hexadecimal ; elles
peuvent suivre la commande POKE et vous permettre ainsi
de contrôler une partie de l'écran
ou
de BB
80
de A000
à BFEO (TEXT)
à BFEO (HIRES)
ou d'accéder au stockage des caractères alternés ou stan-
dards pour en modifier les définitions par exemple.
9800
9C00
A000
BFEO
BB80
B800
B400
en
en
en
en
en
en
en
décimal
décimal
décimal
décimal
décimal
décimal
décimal :
38912
39936
40960
49120
48000
47104
46080
— 188 -
Annexe H ROLE DES ATTRIBUTS
: encre VERTE
: encre JAUNE
: encre BLEU
: encre MAGENTA
encre CYAN
encre BLANCHE
10
11
12
14
1011
1100
1101
1110
Caractère standard
simple hauteur
Caractère alterné
simple hauteur
Caractère standard
double hauteur
: Caractère alterné
: double hauteur
: Clignotement simple :
: hauteur standard
: Clignotement simple :
: hauteur alterné :
: Clignotement double :
: hauteur standard
: Clignotement double
: hauteur alterné
papier NOIR
papier ROUGE
: papier VERT
: papier JAUNE
: papier BLEU
papier MAGENTA
papier CYAN
: papier BLANC
.
.
: Changement de
synchronisation
Les fonctions décrites dans ce tableau sont celles
obtenues pour des attributs suivant les commandes PLOT,
FILL, POKE.
L'utilisation de X, O <X <31 dans la commande PRINT
CHR$(X) est plutôt à relier à
contrôle (voir appendice B).
— 189 -
l'action des caractères de
INDEX ALPHABETIQUE
ABS sssoossessssescesese des se de 6e de 6 016 0
Acquisition de données ............sssese
Addition sscessuossoeoseoss secs. see does 6 0e
Affectation ..s..ssssscssssossccscssescuee
Alternée (forme) ...s.sssssssssssssosseoee
AND vssososssossssusouescssecosssocsseuses
Appel d'un sous-programme ee...
Arctangente...esssssssssscssssscessssssee
Arrêt d'une exécution de programme ......
ASC csssocossossossosssesoussssonssessess
ASCII (code)
ATN cosssososososesesssoseseseseessseesee
Attribut
BASLC sécu soie es ee den dde sde 00
Basse résolution ee...
Binaire (code) ..
CCC
Bit csscsosssssesossosssessesescssreseee
Boucle ses. sus se ses 6e 7 0e 0 0 ete 86 60 60e 660
BREAK cosoosossssssesosososononsesessesee
BŸYTE essences
CALL sososssssossessomesesseesessesseesee
Canal. sos eme cs detre ee d'en ere oise 0e
Caractères alphanumériques ......eeseeese
Caractères spéciaux cessoocossssssosessses
Carte mémoire ..ssssoosoossssessesssssee
Cassette osseuse
Cellule ses cesse sé etes se 5e 0e 6e ee se 0
Chaîne de caractères ......ssessssosseeee
CHAR css
Choix conditionnel
CRC
CHRS sense eos ee Se ee de sieate die ee ete ee de
CIROLE ste sise sea Dao ace ses dus D etele fe se 0
CHAVLer se etes ones ete s'est se de eee ee
CLEAR cessssssssosscsececsese
- 190 -
93, 147
19:71
45, 73
90, 92
94, 147
53, 187
93, 148
104, 105,
113, 189
15
105
13
13
30, 51,
49, 83
13
Clignotement ....
CLOAD
CLS
Code d'erreur ...
Commandes fondamentales
Commandes graphiques haute résolution ...
Commandes graphiques basse résolution ...
Constantes
CONT
0...
Correction dans un programme ..s.ssessoe
cos
Cosinus
Couleurs
.…...
......
........
Création de fonction utilisateur ........
CSAVE
CTRL
CTRL
CTRL
CTRL
CTRL
CTRL
CTRL
CURMO
CURSE
A
C
D
F
G
x
V
T
CCC
CCR
0000000...
Cüurseur … ses ses eds eee
Curseur HIRES ......
DATA ..o.ssosesee
DEEK ...
DEF FN
DEF FNA ...........
DEF FNA$ ........
DEF USR
Del
0
......
........
.…...
Dépassement de capacité ..ooossoossosese
Différent (signe différent de) ..........
DIM .....
Dimension d'un tableau ....
DIVISION -s see ds eee. die 80 ro oo die e
DORE ose
Données
DRAW ss
Durée du son ........
....…
lt 108
125, 131
150
46
171
36,
108
114
54,
31,
40
93,
93
108
95
152
145
57
150
151
Effacement d'un programme .......ssessse 36
Effacement d'une ligne ................ 41
ENCre soso scecsese 108
END sesouosssseosesssncss etes ose es 0 40, 77,
Enregistrement d'un programme ..........s 178
Entrée/sortie .......s...ssssssssssssssece 97
EXP nées diese 00.00 4e 8 5-8 see docs so cos ee eee ee 93, 154
Exponentielles .....s.ssesesssssosesssese 93
EXPLODE osseuse 50, 136,
FALSE: siesiotoiciere die s ce 81406 do10.0 81015 0 0 60e 0 e:6 154
FIL sr entente etes onda tomanee LOS 154
EN és css Secret ess sise dde does ends 6066 155
Fonctions ..4.0 00600 606 600,060 66006 2 92
numériques internes....sssssssssssesses 92
mathématiques simples ................. 92
mathématiques complexes ...........+++ 93
traitant les chaînes de caractères .... 93
de conversion ASCII/caractères ......ee 94
de conversion chiffres/lettres ........ 94
Génération d'un nombre aléatoire ........ 92
CRT Side dei das dents dau ate 08100
COSUR tra ao reines éensneet JL 156
COR0: Scan ennemi eee 20 10e
156
GRAB socosoocososemoseessosuusscssscsesce 157
Graphiques esse ososssseesessee 101
Graphiques avancés ..s.sssosssssessssseee 127
Haute résolution .....ssssssoosessesseses 106
Hexadécimal (code) ...sssososoososoessess 56
HEXS. see Ses ee oee se. cleln sie e ùi61:6.0 618 le70 0 0101010. 6 157
HIMEM osseuses 157
HIS dates oise nt AU 97
— 192 -
LE. 4: THEN ss ELSE: ss 00 essor so 0e
ILLEGAL QUANTITY ERROR .....e ses se ss
Indice esse EN CL AE
INK 000000000000 0000000000
INPUT”: Este sise sieste RE
Insertion d'une ligne .....s..ssssesee
Instruction ss... ..
Instructions BASIC facultatives ..... ï
Instructions de transfert ........ss.s.e.e
INT es 00:50 0.6 ae des ne d'oise 0 es 008 Sc à
Interface cassette .....se.sssossssosesee À
Interface imprimante ......ssessssssesse
JeUX sc sde se see EN
KREYS es eee see sc se se 0 déso see s0:818 0.816 01000 :
Langage esse nn
LEFTS ..... . . ......... . .......
LEN +..cce nie dé 6e ec les die cute ie ee c'es se 0-00 ee
LET se sise 66 80 0 2870 0 déesse esse és se
LIST css d esse se 5 6 do 6e 586 êtessre
Listage d'un programme ...... &niotsise cotes
LLIST ss is e de srtre see 008 018 ee id eee es
LN ...... .......... ....
LOG Lo de socio dede gere ec ro de Se ee 60
Logarithme ....... soso …
LORES 255 s ass see sie cee e0 send does
— 193 -
43, 82,
158
3:17
54
108, 158
26, 33,
97, 158
40
26
75
79
48, 93,
158
7, 178
181
42
98, 159
15, 53
94, 159
95, 118,
159
72, 78,
24, 159
30, 36,
159
36
160, 181
160
93
93
103, 160
Mantisse ........
Mémoire +...
Microordinateur ........ os aeré
Microprocesseur .
MID$S ....... se see
Mise en route ...
MISMATCH ERROR ..
Mode graphique ..
Mode direct .....
Mode différé ....
Modem .....eesoos.e
ee
CRE
ee
Modification d'une ligne .....
Mots réservés (ou clés) ......
MUSIC sous
NEW soso
NOT soso
Note soso :
Octet ss.
ee .….
CRC
...... .
. CCR]
CEE ee
Opérateurs +essssss esse se ete se 045 00 «00e
relationnels ........s.se.esesse
adrithmétiques mes ssseieesteseneé este
logiques ......
ON ... GOSUB ....
0...
ON ... GOTO soso sesososenosessessee
OR 0.0
Ordres de transfert inconditionnel
CCC
Ordres de transfert conditionnel ........
OVERFLOW ERROR ..
PAPER soso
Papier ..........
56
5
i
1
95,118,
161
8
59
102, 103
16
16
8
41
25, 59,
145
138, 161
38, 161
139
13
22
72
71
161, 91,
156
162, 29,
79, 156
46, 73
82
55, 171
162, 108
108
Partie entière .....sssssseseosessesesee 48
PATRRN rien eine Toi ins 115, 162
dE EE TE 128, 162
Période + soso ee ss ds doses 138
PI (signe mathématique Pi) .............. 26, 59,
163
PING non ue tea 51, 136,
163
PiRel- sil ue danses anis ee 106, 107
PLAT nu dite ti anite nee RE 140, 141,
163
PO trie eme nc merhedue tite 108, 163
LT EUR 119, 163
ST 128, 163
POP ee io ee ere ere date din e niece lier de 0:00 'e see ee 169
POS: So eterra ote d'os scies e eee eitiee dos © 07e) 0 60 164
PRINT sonia corieli ecrans 12, 16,
24, 29,
34, 164
Prise Péritel ..scssssssssossssssssosssee 7
Programme ....c.ssecosssessesesesesoeseees 18
Programmation .......e.e ssssseesssoesee ee 26
Puissance esse cssescseeee 21, 71
PULL, sas sun ee sec su eee Ces sde se oférace 165
RAM us oo see ant dore ro oo ierei see 6100 ie cle : 5
Racine carrée .....ssesssesesssee Ssieess.: 4193
READ: annee tes ue ets tanre le ec dieie shot 99, 165
RELEASE ....sssssssosseossssessseses .. 165
Remplacement d'une ligne ...............: 28
RÉPRAL 45 UNTDL tone tee donusates 49, 83,
165
Remise à zéro des variables ............. 75
ET TO A TEE 79, 165
Reprendre la main ...........ssssseeesee 89
RESET ..... nés ends eiee cie es 6 6616 01010 6.6 0 60.0 0510 89
RESTORE ...soosseessousocesesceoroseussee 32
Retour chariot .........s.ssssesesesessee 12
RÉ NUAN cad ananas ones 12, 166
RIGHTS Sosa contes aout NRA RTE 166, 194
RND sales séries ne dote sas eds se ee 47, 166
ROM ....... Sete nt en nées eee 18, 39,
166
RUN ...... AR TT 18, 39,
166
SOUND
Sous-programme
Soustraction
SPC
STR$
Suppression d'une ligne
SYNTAX ERROR
TAB
Tableaux
de variables entières
de chaînes de caractères
de variables réelles
TAN
Tangente
TEXT
Test
TROFF
UNDEF'D STATEMENT ERROR
Unité centrale
USR
ee
0
0.000...
Sortie cassette esse
Sortie vidéo
CCC
0...
168
67
68
69
93, 169
102, 169
43
26
169
169
169
80
170
VAL ssces ce ce 6e 00e 0051066 o010 10 ee: 010 0.00 60100
Valeur absolue .......s.ssoosoesoososseee
Variables simples ......ses.sesesssesssse
entléres: d'os ses die 08 à se 08e ve 810 218 010.810 00.6
réelles.sinhsesssssoen ie tsseses as
fndicees.-254 5e delle se cites en ses ce 0 0.000
Volume sas sos dos ec de ets sors sé de se
WAIT css
ZAP ..
.........................
—197 -
50, 170
51, 170
LA BIBLIOTHÈQUE
EDIMICRO
e Collection « Guides
microordinateurs »
de Merly GUIDE DE L'APPLE
Tome 1 L'APPLE standard
Tome 2 Les extensions
Tome 3 Les applications
Tome 4 Les langages
Bayvejiel GUIDE DE L’ORIC
Bieber, Perbost, Renucci GUIDE DU TO 7
e Collection « Jeux »
Chane-Hune, Darbois JEUX SUR ORIC
Perbost, Renucci JEUX SUR TO 7
e Collection « Logiciels »
Bonnet, Dinh MULTIPLAN SUR APPLE
Exercices de Gestion
e Ouvrages de base
Viguier Premiers pas en programmation
sur ORIC
| Les séminaires de formation FDS/Edimicro|
e Pour utilisateurs non spécialistes
VISICALC - MULTIPLAN - GESTION DE FICHIERS -
BASES DE DONNEES - CHOIX D’UN MICROORDINA-
TEUR - BUREAUTIQUE...
e Pour programmeurs débutants
PREMIERS PAS EN BASIC - FICHIERS EN BASIC...
e Pour professionnels de l’informatique
TÉLÉMATIQUE - UNIX - XENIX - MS-DOS - LANGAGE C...
EDIMICRO
121-127, avenue d’Italie, 75013 PARIS
Imprimé en France. — JOUVE, 18, rue Saint-Denis, 75001 PARIS
Dépôt légal 1'° édition : juin 1983
N° 11958. Dépôt légal : Novembre 1983
= GUIDE DE L'ORIC
Philippe Bayveiiel
« Débutants ou experts, amateurs de jeux ou professionnels de la
gestion, ce livre vous passionnera. Laissez-vous conduire pas-à-pas,
et vous constaterez à quel point il est facile d'utiliser et de programmer
| :: - votre ORIC ».
| Denis TAIEB
Importateur de l'ORIC en France
L'ORIC se place dans le peloton de tête des ordinateurs personnels
de sa catégorie : dès son apparition, toute récente, le public lui a fait
un excellent accueil.
Ce guide s'adresse à tous les possesseurs et utilisateurs de l'ORIC,
ainsi qu'à toutes les personnes qui envisagent d'acheter un ordi-
nateur familial et professionnel. Chacun trouvera iciunbonexemple
de ce que peut faire un petit ordinateur et apprendra à s'en servir
même s'il n'a aucune connaissance en informatique.
Le GUIDE DE L'ORIC adopte une démarche très progressive, illus-
trée par de nombreux exemples :
Chapitre 1 : présentation générale de l'ORIC.
Chapitre 2 : initiation à la programmation: créez votre jeu en BASIC.
Chapitre 3 : Le BASIC de l'ORIC.
Chapitre 4 : possibilités graphiques de l'ORIC.
Chapitre 5 : les sons et l'ORIC.
PARLE